<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		
	<span class="different-posts different-posts_earlier">📖 <a href="/page/47">earlier posts</a> 📖</span>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/85. Linux 命令- rsync/">Linux 命令- rsync</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rsync从字面上的意思可以理解为remote sync （远程同步）这样可以理解的更深刻一些。Rsync不仅可以远程同步数据（类似于scp），当然还可以本地同步数据（类似于cp），但不同于cp或scp的一点是，rsync不像cp/scp一样会覆盖以前的数据（如果数据已经存在），它会先判断已经存在的数据和新数据有什么不同，只有不同时才会把不同的部分覆盖掉。如果Linux没有rsync命令使用yum安装</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y rsync</div></pre></td></tr></table></figure>
<h2 id="命令语法"><a href="#命令语法" class="headerlink" title="命令语法"></a>命令语法</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">rsync [OPTION]... SRC DEST </div><div class="line">rsync [OPTION]... SRC [USER@]host:DEST </div><div class="line">rsync [OPTION]... [USER@]HOST:SRC DEST </div><div class="line">rsync [OPTION]... [USER@]HOST::SRC DEST </div><div class="line">rsync [OPTION]... SRC [USER@]HOST::DEST </div><div class="line">rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对应以上六种命令格式，rsync有六种不同的工作模式：</p>
<ol>
<li>拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号 <code>:</code> 分隔符时就启动这种工作模式。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -a /data/backup</div></pre></td></tr></table></figure>
<ol>
<li>使用一个远程shell程序（如rsh、ssh）来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号 <code>:</code> 分隔符时启动该模式。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -avz *.c foo:src</div></pre></td></tr></table></figure>
<ol>
<li>使用一个远程shell程序（如rsh、ssh）来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号 <code>:</code>  分隔符时启动该模式。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -avz foo:src/bar /data</div></pre></td></tr></table></figure>
<ol>
<li>从远程rsync服务器中拷贝文件到本地。当SRC路径信息包含“::”分隔符时启动该模式。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -av root@192.168.78.192::www /databack</div></pre></td></tr></table></figure>
<ol>
<li>从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含“::”分隔符十启动该模式。</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -av /databack root@192.168.78.192::www</div></pre></td></tr></table></figure>
<ol>
<li>列远程机的文件列表。类似于rsync传输，不过主要在命令中省略掉本机信息即可</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -v rsync://192.168.78.192/www</div></pre></td></tr></table></figure>
<h2 id="命令参数"><a href="#命令参数" class="headerlink" title="命令参数"></a>命令参数</h2><ul>
<li>-v, –verbose 详细模式输出。 </li>
<li>-q, –quiet 精简输出模式。 </li>
<li>-c, –checksum 打开校验开关，强制对文件传输进行校验。 </li>
<li>-a, –archive 归档模式，表示以递归方式传输文件，并保持所有文件属性，等于-rlptgoD。 </li>
<li>-r, –recursive 对子目录以递归模式处理。 </li>
<li>-R, –relative 使用相对路径信息。 </li>
<li>-b, –backup 创建备份，也就是对于目的已经存在有同样的文件名时，将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。 </li>
<li>–backup-dir 将备份文件(如~filename)存放在在目录下。 </li>
<li>-suffix=SUFFIX 定义备份文件前缀。 </li>
<li>-u, –update 仅仅进行更新，也就是跳过所有已经存在于DST，并且文件时间晚于要备份的文件，不覆盖更新的文件。 </li>
<li>-l, –links 保留软链结。 </li>
<li>-L, –copy-links 想对待常规文件一样处理软链结。 </li>
<li>–copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。 </li>
<li>–safe-links 忽略指向SRC路径目录树以外的链结。 </li>
<li>-H, –hard-links 保留硬链结。 </li>
<li>-p, –perms 保持文件权限。 </li>
<li>-o, –owner 保持文件属主信息。 </li>
<li>-g, –group 保持文件属组信息。 </li>
<li>-D, –devices 保持设备文件信息。 </li>
<li>-t, –times 保持文件时间信息。 </li>
<li>-S, –sparse 对稀疏文件进行特殊处理以节省DST的空间。 </li>
<li>-n, –dry-run现实哪些文件将被传输。 </li>
<li>-w, –whole-file 拷贝文件，不进行增量检测。 </li>
<li>-x, –one-file-system 不要跨越文件系统边界。 </li>
<li>-B, –block-size=SIZE 检验算法使用的块尺寸，默认是700字节。 </li>
<li>-e, –rsh=command 指定使用rsh、ssh方式进行数据同步。 </li>
<li>–rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。 </li>
<li>-C, –cvs-exclude 使用和CVS一样的方法自动忽略文件，用来排除那些不希望传输的文件。 </li>
<li>–existing 仅仅更新那些已经存在于DST的文件，而不备份那些新创建的文件。 </li>
<li>–delete 删除那些DST中SRC没有的文件。 </li>
<li>–delete-excluded 同样删除接收端那些被该选项指定排除的文件。 </li>
<li>–delete-after 传输结束以后再删除。 </li>
<li>–ignore-errors 及时出现IO错误也进行删除。 </li>
<li>–max-delete=NUM 最多删除NUM个文件。 -</li>
<li>-partial 保留那些因故没有完全传输的文件，以是加快随后的再次传输。 </li>
<li>–force 强制删除目录，即使不为空。 </li>
<li>–numeric-ids 不将数字的用户和组id匹配为用户名和组名。 </li>
<li>–timeout=time ip超时时间，单位为秒。 </li>
<li>-I, –ignore-times 不跳过那些有同样的时间和长度的文件。 </li>
<li>–size-only 当决定是否要备份文件时，仅仅察看文件大小而不考虑文件时间。 </li>
<li>–modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口，默认为0。 </li>
<li>-T –temp-dir=DIR 在DIR中创建临时文件。 </li>
<li>–compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。 </li>
<li>-P 等同于 –partial。 </li>
<li>–progress 显示备份过程。 </li>
<li>-z, –compress 对备份的文件在传输时进行压缩处理。 </li>
<li>–exclude=PATTERN 指定排除不需要传输的文件模式。 </li>
<li>–include=PATTERN 指定不排除而需要传输的文件模式。 </li>
<li>–exclude-from=FILE 排除FILE中指定模式的文件。 </li>
<li>–include-from=FILE 不排除FILE指定模式匹配的文件。 </li>
<li>–version 打印版本信息。 </li>
<li>–address 绑定到特定的地址。 </li>
<li>–config=FILE 指定其他的配置文件，不使用默认的rsyncd.conf文件。 </li>
<li>–port=PORT 指定其他的rsync服务端口。 </li>
<li>–blocking-io 对远程shell使用阻塞IO。 </li>
<li>-stats 给出某些文件的传输状态。 </li>
<li>–progress 在传输时现实传输过程。 </li>
<li>–log-format=formAT 指定日志文件格式。 </li>
<li>–password-file=FILE 从FILE中得到密码。 </li>
<li>–bwlimit=KBPS 限制I/O带宽，KBytes per second。 </li>
<li>-h, –help 显示帮助信息。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;常用选项：-a、-v、–delete、–exclude</p>
<h2 id="使用实例"><a href="#使用实例" class="headerlink" title="使用实例"></a>使用实例</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;试验准备</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># mkdir rsync</span></div><div class="line">[root@localhost ~]<span class="comment"># cd rsync</span></div><div class="line">[root@localhost rsync]<span class="comment"># mkdir test1</span></div><div class="line">[root@localhost rsync]<span class="comment"># cd test1</span></div><div class="line">[root@localhost test1]<span class="comment"># touch 1 2 3</span></div><div class="line">[root@localhost test1]<span class="comment"># ln -s /root/123.txt ./123.txt</span></div><div class="line">[root@localhost test1]<span class="comment"># ls -l</span></div><div class="line">总用量 0</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 1</div><div class="line">lrwxrwxrwx 1 root root 13 6月 10 12:59 123.txt -&gt; /root/123.txt</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 2</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 3</div><div class="line">[root@localhost test1]<span class="comment"># cd ..</span></div></pre></td></tr></table></figure>
<h3 id="实例1：使用-a选项"><a href="#实例1：使用-a选项" class="headerlink" title="实例1：使用-a选项"></a>实例1：使用-a选项</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rsync -a test1 test2</span></div><div class="line">[root@localhost rsync]<span class="comment"># ls test2</span></div><div class="line">test1</div><div class="line">[root@localhost rsync]<span class="comment"># ls test2/test1/</span></div><div class="line">1 123.txt 2 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里有一个问题，就是本来想把test1目录直接拷贝成test2目录，可结果rsync却新建了test2目录，然后把test1目录放到了test2目录中。为了避免这样的情况，可以这样做：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rm -rf test2</span></div><div class="line">[root@localhost rsync]<span class="comment"># rsync -a test1/ test2/</span></div><div class="line">[root@localhost rsync]<span class="comment"># ls -l test2/</span></div><div class="line">总用量 0</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 1</div><div class="line">lrwxrwxrwx 1 root root 13 6月 10 12:59 123.txt -&gt; /root/123.txt</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 2</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加个斜杠就可以了，所以建议在使用rsync备份目录时要养成加斜杠的习惯。-a选项表示以递归方式传输文件，并保持所有属性，等同于-rlptgoD。-a选项后面可以跟一个 <code>--no-OPTION</code> 这个表示关闭 -rlptgoD中的某一个，例如，<code>-a--no-l</code> 等同于 -rptgoD。下面看一看-l选项的作用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rsync -av --no-l test1/ test2/</span></div><div class="line">sending incremental file list</div><div class="line">created directory test2</div><div class="line">./</div><div class="line">1</div><div class="line">skipping non-regular file <span class="string">"123.txt"</span></div><div class="line">2</div><div class="line">3</div><div class="line"></div><div class="line">sent 200 bytes received 72 bytes 544.00 bytes/sec</div><div class="line">total size is 13 speedup is 0.05</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用-v选项看起来方便，上例跳过了非普通文件123.txt，其实123.txt是一个软连接文件，如果不使用-l选项则不理会软连接文件的。虽然加上-l选项会把软连接文件给拷贝过去，但是软连接的目标文件却没有拷贝过去。</p>
<h3 id="实例2：使用-L选项"><a href="#实例2：使用-L选项" class="headerlink" title="实例2：使用-L选项"></a>实例2：使用-L选项</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rsync -avL test1/ test2/</span></div><div class="line">sending incremental file list</div><div class="line">created directory test2</div><div class="line">./</div><div class="line">1</div><div class="line">123.txt</div><div class="line">2</div><div class="line">3</div><div class="line"></div><div class="line">sent 231 bytes received 91 bytes 644.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div><div class="line">[root@localhost rsync]<span class="comment"># ls -l test2/</span></div><div class="line">总用量 0</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 1</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:39 123.txt</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 2</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加上-L选项就可以把SRC中软连接的目标文件给拷贝到DST。</p>
<h3 id="实例3：使用-u选项"><a href="#实例3：使用-u选项" class="headerlink" title="实例3：使用-u选项"></a>实例3：使用-u选项</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先查看一下test1/1和test2/1的创建时间（肯定是一样的），然后使用touch修改一下test2/1的创建时间（此时test2/1要比test1/1的创建时间晚了一些），如果不加-u选项的话，会把test2/1的创建时间编程和test1/1的创建时间一样。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># ll test1/1 test2/1</span></div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 test1/1</div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 test2/1</div><div class="line">root@localhost rsync]<span class="comment"># touch test2/1</span></div><div class="line">[root@localhost rsync]<span class="comment"># ll test2/1</span></div><div class="line">-rw-r--r-- 1 root root 0 6月 10 13:20 test2/1</div><div class="line">[root@localhost rsync]<span class="comment"># rsync -a test1/1 test2/</span></div><div class="line">[root@localhost rsync]<span class="comment"># ll test2/1</span></div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 test2/1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加上-u选项后，不会再把test1/1同步为test2/1了。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># touch test2/1</span></div><div class="line">[root@localhost rsync]<span class="comment"># ll test2/1</span></div><div class="line">-rw-r--r-- 1 root root 0 6月 10 13:31 test2/1</div><div class="line">[root@localhost rsync]<span class="comment"># rsync -avu test1/ test2/</span></div><div class="line">sending incremental file list</div><div class="line">./</div><div class="line">123.txt -&gt; /root/123.txt</div><div class="line"></div><div class="line">sent 100 bytes received 18 bytes 236.00 bytes/sec</div><div class="line">total size is 13 speedup is 0.11</div><div class="line">[root@localhost rsync]<span class="comment"># ll test2/1</span></div><div class="line">-rw-r--r-- 1 root root 0 6月 10 13:31 test2/1</div><div class="line">[root@localhost rsync]<span class="comment"># ll test1/1</span></div><div class="line">-rw-r--r-- 1 root root 0 6月 10 12:58 test1/1</div></pre></td></tr></table></figure>
<h3 id="实例4：使用-–delete选项"><a href="#实例4：使用-–delete选项" class="headerlink" title="实例4：使用 –delete选项"></a>实例4：使用 –delete选项</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先删除test1/123.txt</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rm -f test1/123.txt</span></div><div class="line">[root@localhost rsync]<span class="comment"># ls test1/</span></div><div class="line">1 2 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后把test1/目录同步到test2/目录下</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rsync -av test1/ test2/</span></div><div class="line">sending incremental file list</div><div class="line">./</div><div class="line">1</div><div class="line"></div><div class="line">sent 94 bytes received 34 bytes 256.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div><div class="line">[root@localhost rsync]<span class="comment"># ls test2/</span></div><div class="line">1 123.txt 2 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;test2/目录并没有删除掉123.txt，下面加上 <code>--delete</code> 选项：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rsync -av --delete test1/ test2/</span></div><div class="line">sending incremental file list</div><div class="line">deleting 123.txt</div><div class="line"></div><div class="line">sent 52 bytes received 12 bytes 128.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div><div class="line">[root@localhost rsync]<span class="comment"># ls test2/</span></div><div class="line">1 2 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;test2/目录里的123.txt也被删除了，这就是 <code>--delete</code> 选项的用处。还有一种情况就是如果在DST增加了文件了，而SRC当中没有这些文件，同步时加上 <code>--delete</code> 选项后同样会删除新增的文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># touch test2/4</span></div><div class="line">[root@localhost rsync]<span class="comment"># ls test1/</span></div><div class="line">1 2 3</div><div class="line">[root@localhost rsync]<span class="comment"># ls test2/</span></div><div class="line">1 2 3 4</div><div class="line">[root@localhost rsync]<span class="comment"># rsync -a --delete test1/ test2/</span></div><div class="line">[root@localhost rsync]<span class="comment"># ls test1/</span></div><div class="line">1 2 3</div><div class="line">[root@localhost rsync]<span class="comment"># ls test2/</span></div><div class="line">1 2 3</div></pre></td></tr></table></figure>
<h3 id="实例5：使用-–exclude选项"><a href="#实例5：使用-–exclude选项" class="headerlink" title="实例5：使用 –exclude选项"></a>实例5：使用 –exclude选项</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[[root@localhost rsync]<span class="comment"># touch test1/4</span></div><div class="line">[root@localhost rsync]<span class="comment"># rsync -a --exclude="4" test1/ test2/</span></div><div class="line">[root@localhost rsync]<span class="comment"># ls test1/</span></div><div class="line">1 2 3 4</div><div class="line">[root@localhost rsync]<span class="comment"># ls test2/</span></div><div class="line">1 2 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外还可以使用匹配字符 *</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># touch test1/1.txt test1/2.txt</span></div><div class="line">[root@localhost rsync]<span class="comment"># ls test1/</span></div><div class="line">1 1.txt 2 2.txt 3 4</div><div class="line">[root@localhost rsync]<span class="comment"># rsync -a --progress --exclude="*.txt" test1/ test2/</span></div><div class="line">sending incremental file list</div><div class="line">./</div><div class="line">4</div><div class="line">0 100% 0.00kB/s 0:00:00 (xfer<span class="comment">#1, to-check=0/5)</span></div><div class="line"></div><div class="line">sent 104 bytes received 34 bytes 276.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div><div class="line">[root@localhost rsync]<span class="comment"># ls test2/</span></div><div class="line">1 2 3 4</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上例中，连带着使用了 <code>--progress</code> 选项，这个主要是用来观察rsync同步过程的状态的。简单总结一下，平时使用rsync同步数据的时候，使用-a选项基本上就可以达到想要的效果了，只是有时候会有个别的需求，会用到 <code>-a --no-OPTION</code> , <code>-u</code> , <code>-L</code> , <code>--delete</code> , <code>--exclude</code> 以及 <code>--progress</code> 这些选项。</p>
<h3 id="实例6：ssh隧道方式"><a href="#实例6：ssh隧道方式" class="headerlink" title="实例6：ssh隧道方式"></a>实例6：ssh隧道方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">root@localhost rsync]<span class="comment"># rsync -avL test1/ www@192.168.0.101:/tmp/test2/</span></div><div class="line">www@192.168.0.101<span class="string">'s password:</span></div><div class="line"><span class="string">sending incremental file list</span></div><div class="line"><span class="string">created directory /tmp/test2</span></div><div class="line"><span class="string">./</span></div><div class="line"><span class="string">1</span></div><div class="line"><span class="string">1.txt</span></div><div class="line"><span class="string">2</span></div><div class="line"><span class="string">2.txt</span></div><div class="line"><span class="string">3</span></div><div class="line"><span class="string">4</span></div><div class="line"><span class="string"></span></div><div class="line"><span class="string">sent 327 bytes received 129 bytes 182.40 bytes/sec</span></div><div class="line"><span class="string">total size is 0 speedup is 0.00</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这种方式是通过ssh拷贝数据，需要输入192.168.0.101那台机器www账户的密码。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">[root@localhost rsync]<span class="comment"># rsync -avL www@192.168.0.101:/tmp/test2/ ./test3/</span></div><div class="line">www@192.168.0.101<span class="string">'s password:</span></div><div class="line"><span class="string">receiving incremental file list</span></div><div class="line"><span class="string">created directory ./test3</span></div><div class="line"><span class="string">./</span></div><div class="line"><span class="string">1</span></div><div class="line"><span class="string">1.txt</span></div><div class="line"><span class="string">2</span></div><div class="line"><span class="string">2.txt</span></div><div class="line"><span class="string">3</span></div><div class="line"><span class="string">4</span></div><div class="line"><span class="string"></span></div><div class="line"><span class="string">sent 128 bytes received 351 bytes 38.32 bytes/sec</span></div><div class="line"><span class="string">total size is 0 speedup is 0.00</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以上两种凡是如果写到脚背里，备份起来就有麻烦了，因为要输入密码，脚本本来就是自动的，不可能做到。但是不代表没有解决办法。那微是统计过密钥验证，密钥不设立密码就ok了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在操作以前先设置主机信息：192.168.0.10（主机名yanyi-1）和192.168.0.101（主机名yanyi），需要从yanyi-1拷贝数据到yanyi上。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先确认一下yanyi-1上是否有这个文件 <code>/root/.ssh/id_rsa.pub</code></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># ssh-keygen</span></div><div class="line">Generating public/private rsa key pair.</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果Linux不存在这个文件，按如下方法生成：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># ssh-keygen</span></div><div class="line">Generating public/private rsa key pair.</div><div class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/root/.ssh/id_rsa):</div><div class="line">Enter passphrase (empty <span class="keyword">for</span> no passphrase):</div><div class="line">Enter same passphrase again:</div><div class="line">Your identification has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.</div><div class="line">Your public key has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.pub.</div><div class="line">The key fingerprint is:</div><div class="line">3b:74:af:e8:08:ac:99:30:3f:ef:84:7a:a0:a6:3d:89 root@Aming-1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在这个过程中会有一些交互的过程，它首先提示要输入这个密钥的密码，出于安全考虑应该定义个密码，但是目的就是为了自动化同步数据，所以这里不输入任何密码，直接按回车，即密码为空。最后则生成了私钥 <code>/root/.ssh/id_rsa</code> 和公钥文件 <code>/root/.ssh/id_rsa.pub</code></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;把公钥文件的内容拷贝到目标机器上：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">root@yanyi-1 ~]<span class="comment"># cat .ssh/id_rsa.pub</span></div><div class="line">ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5SPyJ/kliGTAMUan/GCN325VS8jMxvOn4uQoLU/NqBpCI3MrmvSucv6EAzxx1J2uOssW08el06LG+cUwXmm5mkqDRBV6C9qNnR/bVV5vr3QsUwbKPr7fdyJvruQWWR7cSL+mjP0SYmG2Qy2JcM3hl1IZArzC6yeUnq2Gwbax8LgbZE3XfRfOYdimwyh5Tfft7yLYipWc37k+oRUWkI3mW7PalsOlfQhxrLD/lS891y6RdSbGxMJWPoV0KMFbVh+uJgyAXpeuWl+F+/iuQPzb6w3h4pWI31bvbsE9BU82jSzHYEjpq3SN2MJN2vaLs5a0mVpm9zka/h4ITFB8Uy1iSQ== root@yanyi-1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;复制主机yanyi-1的 <code>/root/.ssh/id_rsa.pub</code> 文件内容，并粘贴到主机yanyi的 <code>/home/www/.ssh/authorized_keys</code> 中:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># vim /home/www/.ssh/authorized_keys</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这一步也许会遇到/home/www/.ssh目录不存在的问题，可以手动创建，并修改目录权限为700，也可以执行 <code>ssh-krygen</code> 命令生成这个目录。保存/home/www/.ssh/authorized_keys文件后，再到主机yanyi-1上执行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># ssh www@192.168.0.101</span></div><div class="line">Last login: Wed Jun 12 12:24:34 2013 from 192.168.0.10</div><div class="line">[www@yanyi ~]$</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;现在不用输入密码也可以登录主机yanyi了。下面先用yanyi主机退出来，再从主机yanyi-1上执行rsync命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># rsync -av rsync/test1/ www@192.168.0.101:/tmp/test4/</span></div><div class="line">sending incremental file list</div><div class="line">created directory /tmp/test4</div><div class="line">./</div><div class="line">1</div><div class="line">1.txt</div><div class="line">2</div><div class="line">2.txt</div><div class="line">3</div><div class="line">4</div><div class="line"></div><div class="line">sent 327 bytes received 129 bytes 912.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div></pre></td></tr></table></figure>
<h3 id="实例7：后台服务方式"><a href="#实例7：后台服务方式" class="headerlink" title="实例7：后台服务方式"></a>实例7：后台服务方式</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这种方式可以理解成，在远程主机上建立一个rsync的服务器，在服务器上匹配好rsync的各种应用，然后本机作为rsync的一个客户端去连接远程的rsync服务器。</p>
<h4 id="1、建立并配置rsync的配置文件-etc-rsyncd-conf"><a href="#1、建立并配置rsync的配置文件-etc-rsyncd-conf" class="headerlink" title="1、建立并配置rsync的配置文件 /etc/rsyncd.conf"></a>1、建立并配置rsync的配置文件 /etc/rsyncd.conf</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]# vim /etc/rsyncd.conf</div><div class="line"><span class="meta">#</span><span class="bash">port=873</span></div><div class="line">log file=/var/log/rsync.log</div><div class="line">pid file=/var/run/rsyncd.pid</div><div class="line"><span class="meta">#</span><span class="bash">address=192.168.0.10</span></div><div class="line"></div><div class="line">[test]</div><div class="line">path=/root/rsync</div><div class="line">use chroot=true</div><div class="line">max connections=4</div><div class="line">read only=no</div><div class="line">list=true</div><div class="line">uid=root</div><div class="line">gid=root</div><div class="line">auth users=test</div><div class="line">secrets file=/etc/rsyncd.passwd</div><div class="line">hosts allow=192.168.0.101</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中配置文件分为两部分：全局置部分和模块配置部分。全局部分就是几个参数而已，就像rsyncd.conf中port、log file、pid file、address这些都属于全局配置。而 [test]以下部分就是模块配置部分了。一个配置文件中可以有多个模块，模块名自定义，格式就像rsyncd.conf中的这样。其实模块中的一些参数例如，use chroot、max connections、uid、gid、auth users、secrets file以及hosts allow都恶意可配置成全局的参数。当然给出的参数并不是所有的，可以通过 <code>man rsyncd.conf</code> 获得更多信息。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面简单解释一下这些参数的意义 ：</p>
<ul>
<li>port 指定在哪个端口启动rsyncd服务，默认是873</li>
<li>log file 指定日志文件</li>
<li>pid file 指定pid文件，这个文件的作用涉及到服务的启动以及停止等进程管理操作</li>
<li>address 指定启动rsyncd服务的IP，假如你的机器有多个IP，就可以指定其中一个启动rsyncd服务，默认是在全部IP上启动</li>
<li>[test] 指定模块名，自定义</li>
<li>path 指定数据存放的路径</li>
<li>use chroot true|false 默认是true，意思是在传输文件以前首先chroot到path参数所指  定的目录下。这样做的原因是实现额外的安全防护，但是缺点是需要以roots权限，并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true，如果数据当中有软连接文件的话建议设置成false。</li>
<li>max connections 指定最大的连接数，默认是0即没有限制</li>
<li>read only ture|false 如果为true则不能上传到该模块指定的路径下</li>
<li>list 指定当用户查询该服务器上的可用模块时，该模块是否被列出，设定为true则列出，false则隐藏</li>
<li>uid/gid 指定传输文件时，以哪个用户/组的身份传输</li>
<li>auth users 指定传输时要使用的用户名</li>
<li>secrets file 指定密码文件，该参数连同上面的参数如果不指定则不使用密码验证，注  意该密码文件的权限一定要是600</li>
<li>hosts allow 指定被允许连接该模块的主机，可以是IP或者网段，如果是多个，之间用空格隔开</li>
</ul>
<h4 id="2、编辑secrets-file，保存后要赋予600权限，如果权限不对，不能完成同步"><a href="#2、编辑secrets-file，保存后要赋予600权限，如果权限不对，不能完成同步" class="headerlink" title="2、编辑secrets file，保存后要赋予600权限，如果权限不对，不能完成同步"></a>2、编辑secrets file，保存后要赋予600权限，如果权限不对，不能完成同步</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># cat /etc/rsyncd.passwd</span></div><div class="line"><span class="built_in">test</span>:test123</div><div class="line">[root@yanyi-1 ~]<span class="comment"># chmod 600 /etc/rsyncd.passwd</span></div></pre></td></tr></table></figure>
<h4 id="3、启动rsync服务"><a href="#3、启动rsync服务" class="headerlink" title="3、启动rsync服务"></a>3、启动rsync服务</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># rsync --daemon --config=/etc/rsyncd.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;启动后，可以查看一下日志，并查看端口是否启动：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># cat /var/log/rsync.log</span></div><div class="line">[root@yanyi-1 ~]<span class="comment"># netstat -lnp |grep 873</span></div><div class="line">tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 12066/rsync</div><div class="line">tcp 0 0 :::873 :::* LISTEN 12066/rsync</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果想开机启动，把 <code>rsync --daemon --config=/etc/rsyncd.conf</code> 写入到 <code>/etc/rc.d/rc.local</code> 文件中。</p>
<h4 id="4、到另一台机器上测试"><a href="#4、到另一台机器上测试" class="headerlink" title="4、到另一台机器上测试"></a>4、到另一台机器上测试</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># rsync -avL test@192.168.0.10::test/test1/ /tmp/test5/</span></div><div class="line">Password:</div><div class="line">receiving incremental file list</div><div class="line">created directory /tmp/test5</div><div class="line">./</div><div class="line">1</div><div class="line">1.txt</div><div class="line">2</div><div class="line">2.txt</div><div class="line">3</div><div class="line">4</div><div class="line"></div><div class="line">sent 143 bytes received 354 bytes 994.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;刚提到有一个选项叫做 <code>use chroot</code> 默认为true，如果为true，同步的文件中有软连接，则会有问题。首先在主机yanyi-1的/root/rsync/test1/目录下创建一个软连接文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># ln -s /root/test.txt rsync/test1/test.txt</span></div><div class="line">[root@yanyi-1 ~]<span class="comment"># ls -l rsync/test1/test.txt</span></div><div class="line">lrwxrwxrwx 1 root root 14 6月 12 13:24 rsync/test1/test.txt -&gt; /root/test.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后再到主机yanyi上同步：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># rsync -avL test@192.168.0.10::test/test1/ /tmp/test6/</span></div><div class="line">Password:</div><div class="line">receiving incremental file list</div><div class="line">symlink has no referent: <span class="string">"/test1/test.txt"</span> (<span class="keyword">in</span> <span class="built_in">test</span>)</div><div class="line">created directory /tmp/test6</div><div class="line">./</div><div class="line">1</div><div class="line">1.txt</div><div class="line">2</div><div class="line">2.txt</div><div class="line">3</div><div class="line">4</div><div class="line"></div><div class="line">sent 143 bytes received 419 bytes 1124.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div><div class="line">rsync error: some files/attrs were not transferred (see previous errors) (code</div><div class="line">23) at main.c(1532) [generator=3.0.6]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以看到，如果设置 <code>use chroot</code> 为true则同步软连接文件会有问题，把主机yanyi-1的rsync配置文件修改一下，把true改为false：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@yanyi-1 ~]<span class="comment"># sed -i 's/use chroot=true/use chroot=false/' /etc/rsyncd.conf</span></div><div class="line">[root@yanyi-1 ~]<span class="comment"># grep 'use chroot' /etc/rsyncd.conf</span></div><div class="line">use chroot=<span class="literal">false</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后再到主机yanyi上再次执行同步：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># rsync -avL test@192.168.0.10::test/test1/ /tmp/test7/</span></div><div class="line">Password:</div><div class="line">receiving incremental file list</div><div class="line">created directory /tmp/test7</div><div class="line">./</div><div class="line">1</div><div class="line">1.txt</div><div class="line">2</div><div class="line">2.txt</div><div class="line">3</div><div class="line">4</div><div class="line">test.txt</div><div class="line"></div><div class="line">sent 162 bytes received 410 bytes 1144.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就没有任何问题了。为什么修改完rsyncd.conf配置文件后，没有重启rsyncd服务？其实这是rsync的一个特定机制，配置文件即实时生效的，不用重启服务。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面的例子中，都有输入密码，这样同样不能写入脚本中自动执行，其实这种方式也是可以不用手动输入密码的，有两种实现方式：</p>
<h5 id="1、指定密码文件"><a href="#1、指定密码文件" class="headerlink" title="1、指定密码文件"></a>1、指定密码文件</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在客户端上，也就是主机yanyi上，编辑一个密码文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># vim /etc/pass</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入test用户的密码：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># cat /etc/pass</span></div><div class="line">test123</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改密码文件的权限：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># chmod 600 /etc/pass</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在同步的时候，指定一下密码文件，就可以省去输入密码的步骤了：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">[root@yanyi ~]<span class="comment"># rsync -avL test@192.168.0.10::test/test1/ /tmp/test8/ --password-file=/etc/pass</span></div><div class="line">receiving incremental file list</div><div class="line">created directory /tmp/test8</div><div class="line">./</div><div class="line">1</div><div class="line">1.txt</div><div class="line">2</div><div class="line">2.txt</div><div class="line">3</div><div class="line">4</div><div class="line">test.txt</div><div class="line"></div><div class="line">sent 190 bytes received 451 bytes 1282.00 bytes/sec</div><div class="line">total size is 0 speedup is 0.00</div></pre></td></tr></table></figure>
<h5 id="2、在rsync服务器端不指定用户"><a href="#2、在rsync服务器端不指定用户" class="headerlink" title="2、在rsync服务器端不指定用户"></a>2、在rsync服务器端不指定用户</h5><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在服务端也就是主机yanyi-1上修改配置文件rsyncd.conf，去掉关于认证账户的配置项(auth user和secrets file这两行)：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sed -i <span class="string">'s/auth users/#auth users/;s/secrets file/#secrets file/'</span> /etc/rsyncd.conf</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面的命令是把“auth users”和“secrets file”两行的最前面加一个“#”，这样就把这两行注释掉了，使其失去意义。sed的这种用法，只是用分号把两个替换的子命令块给替换了。然后到客户端主机yanyi上测试：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">rsync -avL 192.168.0.10::<span class="built_in">test</span>/test1/ /tmp/test9/</div><div class="line">receiving incremental file list</div><div class="line">created directory /tmp/test9</div><div class="line">./</div><div class="line">1</div><div class="line">1.txt</div><div class="line">2</div><div class="line">2.txt</div><div class="line">3</div><div class="line">4</div><div class="line">test.txt</div><div class="line">sent 162 bytes  received 410 bytes  1144.00 bytes/sec</div><div class="line">total size is 0  speedup is 0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意，这里不用再加test这个用户了，默认是以root的身份拷贝的，现在已经不需要输入密码了。</p>
<h3 id="实例8：根据一个文件列表文档来同步"><a href="#实例8：根据一个文件列表文档来同步" class="headerlink" title="实例8：根据一个文件列表文档来同步"></a>实例8：根据一个文件列表文档来同步</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有时候，需要根据一个文档中的文件列表来同步文件。例，1.txt是文件列表，内容为：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">cat 1.txt</div><div class="line">/data/a/a.txt</div><div class="line">/data/b.txt</div><div class="line">/data/c/b/c.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;同步命令是：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -av --files-from=1.txt / ip::module/</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;需要注意的是，1.txt中如果写全局路径，那么source目录需要写/</p>
<h3 id="实例9：在远程自动创建目录"><a href="#实例9：在远程自动创建目录" class="headerlink" title="实例9：在远程自动创建目录"></a>实例9：在远程自动创建目录</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认情况下，使用rsync的时候，不能自动创建级联目录。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -a /data/1/2/3/1.txt 1.1.1.1:/data/1/2/3/1.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样会报错的。改一改上边的命令</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -a /data/1/2/3/1.txt 1.1.1.1:/data/</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样同样也达不到想要的效果。虽然不在报错，但是只是把1.txt放到了1.1.1.1:/data/目录下。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rsync有个选项就是-R，会帮助我们自动创建级联目录。所以上边的命令应该改成</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -aR /data/1/2/3/1.txt 1.1.1.1:/data/</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就会在1.1.1.1:/data/目录下创建1/2/3/这样的级联目录，类似mkdir -p</p>
<h3 id="实例10：只同步指定类型的文件"><a href="#实例10：只同步指定类型的文件" class="headerlink" title="实例10：只同步指定类型的文件"></a>实例10：只同步指定类型的文件</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;需求：同步某个目录下所有的图片（*.jpg），该目录下有很多其他的文件，但只想同步*.jpg的文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rsync有一个 <code>--exclude</code> 可以排除指定文件，还有一个 <code>--include</code> 选项的作用正好和  <code>--exclude</code> 相反。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;直接使用 <code>--include=&quot;*.jpg&quot;</code> 可否实现？</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -av --include=<span class="string">"*.jpg"</span> /src/ /des/</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;实验证明，这是不对的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正确的答案是：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rsync -av --include=<span class="string">"*.jpg"</span> --exclude=* /src/ /des/</div></pre></td></tr></table></figure>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/84. Linux 命令- curl/">Linux 命令- curl</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;curl是Linux系统命令行下用来简单测试web访问的工具，是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载。</p>
<h2 id="命令参数"><a href="#命令参数" class="headerlink" title="命令参数"></a>命令参数</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;curl命令参数很多。</p>
<ul>
<li><p>-a/–append 上传文件时，附加到目标文件</p>
</li>
<li><p>-A:随意指定自己这次访问所宣称的自己的浏览器信息</p>
</li>
<li><p>-b/–cookie <name=string file=""> cookie字符串或文件读取位置，使用option来把上次的cookie信息追加到http request里面去。</name=string></p>
</li>
<li><p>-c/–cookie-jar <file> 操作结束后把cookie写入到这个文件中</file></p>
</li>
<li><p>-C/–continue-at <offset>  断点续转</offset></p>
</li>
<li><p>-d/–data <data>   HTTP POST方式传送数据</data></p>
<ul>
<li>–data-ascii <data>    以ascii的方式post数据</data></li>
<li>–data-binary <data>    以二进制的方式post数据</data></li>
<li>–negotiate    使用HTTP身份验证</li>
<li>–digest    使用数字身份验证</li>
<li>–disable-eprt    禁止使用EPRT或LPRT</li>
<li>–disable-epsv    禁止使用EPSV</li>
</ul>
</li>
<li><p>-D/–dump-header <file> 把header信息写入到该文件中</file></p>
<ul>
<li>–egd-file <file>  为随机数据(SSL)设置EGD socket路径</file></li>
<li>–tcp-nodelay     使用TCP_NODELAY选项</li>
</ul>
</li>
<li><p>-e/–referer <url>  指定引用地址</url></p>
</li>
<li><p>-F/–form <name=content>   模拟http表单提交数据</name=content></p>
<ul>
<li>–form-string <name=string> 模拟http表单提交数据</name=string></li>
</ul>
</li>
<li><p>-G/–get    以get的方式来发送数据</p>
</li>
<li><p>-H/–header <header> 指定请求头参数</header></p>
<ul>
<li>–ignore-content-length  忽略的HTTP头信息的长度</li>
</ul>
</li>
<li><p>-i/–include     输出时包括protocol头信息</p>
</li>
<li><p>-I/–head 仅返回头部信息，使用HEAD请求</p>
</li>
<li><p>-k/–insecure  允许不使用证书到SSL站点</p>
</li>
<li><p>-K/–config    指定的配置文件读取</p>
</li>
<li><p>-l/–list-only   列出ftp目录下的文件名称</p>
<ul>
<li>–limit-rate <rate> 设置传输速度</rate></li>
<li>–local-port<num>  强制使用本地端口号</num></li>
</ul>
</li>
<li><p>-m/–max-time <seconds> 指定处理的最大时长</seconds></p>
<ul>
<li>–max-redirs <num>    设置最大读取的目录数</num></li>
<li>–max-filesize <bytes>  设置最大下载的文件总量</bytes></li>
</ul>
</li>
<li><p>-o/–output <file>   指定输出文件名称</file></p>
</li>
<li><p>-O/–remote-name  把输出写到该文件中，保留远程文件的文件名</p>
</li>
<li><p>-v/–verbose  小写的v参数，用于打印更多信息，包括发送的请求信息，这在调试脚本是特别有用。</p>
</li>
<li><p>-s/–slient 减少输出的信息，比如进度</p>
</li>
<li><p>–connect-timeout <seconds> 指定尝试连接的最大时长</seconds></p>
</li>
<li><p>-x/–proxy <proxyhost[:port]> 指定代理服务器地址和端口，端口默认为1080</proxyhost[:port]></p>
</li>
<li><p>-u/–user <user[:password]>设置服务器的用户和密码</user[:password]></p>
</li>
<li><p>-r/–range <range>检索来自HTTP/1.1或FTP服务器字节范围</range></p>
<ul>
<li>–range-file 读取（SSL）的随机文件</li>
</ul>
</li>
<li><p>-R/–remote-time   在本地生成文件时，保留远程文件时间</p>
<ul>
<li>–retry <num>   指定重试次数</num></li>
<li>–retry-delay <seconds>   传输出现问题时，设置重试间隔时间</seconds></li>
<li>–retry-max-time <seconds>  传输出现问题时，设置最大重试时间</seconds></li>
</ul>
</li>
<li><p>-s/–silent  静默模式。不输出任何东西</p>
</li>
<li><p>-S/–show-error  显示错误</p>
<ul>
<li>–socks4 <host[:port]> 用socks4代理给定主机和端口</host[:port]></li>
<li>–socks5 <host[:port]> 用socks5代理给定主机和端口</host[:port]></li>
<li>–stderr <file></file></li>
</ul>
</li>
<li><p>-x/–proxy <host[:port]> 在给定的端口上使用HTTP代理</host[:port]></p>
</li>
<li><p>-X/–request <command> 指定什么命令。curl默认的HTTP动词是GET，使用-X参数可以支持其他动词。</p>
</li>
<li><p>-T/–upload-file <file> 指定上传文件路径</file></p>
</li>
</ul>
<h2 id="命令功能"><a href="#命令功能" class="headerlink" title="命令功能"></a>命令功能</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;curl命令是一个功能强大的网络工具，它能够通过http、ftp等方式下载文件，也能够上传文件，同时支持HTTPS等众多协议，还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。其实curl远不止前面所说的那些功能，大家可以通过man curl阅读手册页获取更多的信息。类似的工具还有wget。curl命令使用了libcurl库来实现，libcurl库常用在C程序中用来处理HTTP请求，curlpp是libcurl的一个C++封装，这几个东西可以用在抓取网页、网络监控等方面的开发，而curl命令可以帮助来解决开发过程中遇到的问题。</p>
<h2 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h2><h3 id="1-x指定ip和端口，省略写hosts，方便使用"><a href="#1-x指定ip和端口，省略写hosts，方便使用" class="headerlink" title="1.-x指定ip和端口，省略写hosts，方便使用"></a>1.-x指定ip和端口，省略写hosts，方便使用</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># curl -xip:port www.baidu.com</span></div></pre></td></tr></table></figure>
<h3 id="2-I可以把当前的内容略掉，只显示状态码，-v可以显示详细过程"><a href="#2-I可以把当前的内容略掉，只显示状态码，-v可以显示详细过程" class="headerlink" title="2.-I可以把当前的内容略掉，只显示状态码，-v可以显示详细过程"></a>2.-I可以把当前的内容略掉，只显示状态码，-v可以显示详细过程</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># curl -Iv http://www.qq.com</span></div></pre></td></tr></table></figure>
<h3 id="3-u可以指定用户名和密码"><a href="#3-u可以指定用户名和密码" class="headerlink" title="3.-u可以指定用户名和密码"></a>3.-u可以指定用户名和密码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># curl -u user:password http://123.com</span></div></pre></td></tr></table></figure>
<h3 id="4-O直接下载页面或者对象"><a href="#4-O直接下载页面或者对象" class="headerlink" title="4.-O直接下载页面或者对象"></a>4.-O直接下载页面或者对象</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># curl http://study.lishiming.net/index.heml -O</span></div></pre></td></tr></table></figure>
<h3 id="5-o自定义名字"><a href="#5-o自定义名字" class="headerlink" title="5.-o自定义名字"></a>5.-o自定义名字</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># curl -o index2 http://study.lishiming.net/index.heml</span></div></pre></td></tr></table></figure>
<h2 id="使用实例"><a href="#使用实例" class="headerlink" title="使用实例"></a>使用实例</h2><h3 id="实例1：读取网页"><a href="#实例1：读取网页" class="headerlink" title="实例1：读取网页"></a>实例1：读取网页</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl http://www.linuxidc.com</div></pre></td></tr></table></figure>
<h3 id="实例2：保存网页"><a href="#实例2：保存网页" class="headerlink" title="实例2：保存网页"></a>实例2：保存网页</h3><h4 id="o：将文件保存为命令行中指定的文件名的文件中"><a href="#o：将文件保存为命令行中指定的文件名的文件中" class="headerlink" title="-o：将文件保存为命令行中指定的文件名的文件中"></a>-o：将文件保存为命令行中指定的文件名的文件中</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -o page.html http://www.linuxidc.com.html</div></pre></td></tr></table></figure>
<h4 id="O：使用URL中默认的文件名保存文件到本地"><a href="#O：使用URL中默认的文件名保存文件到本地" class="headerlink" title="-O：使用URL中默认的文件名保存文件到本地"></a>-O：使用URL中默认的文件名保存文件到本地</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -O http://linuxidc.com.html</div></pre></td></tr></table></figure>
<h4 id="其他：可以使用-gt-进行输出"><a href="#其他：可以使用-gt-进行输出" class="headerlink" title="其他：可以使用 &gt; 进行输出"></a>其他：可以使用 <code>&gt;</code> 进行输出</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl http://www.linuxidc.com &gt; page.html</div></pre></td></tr></table></figure>
<h3 id="实例3：使用proxy服务器及其端口：-x"><a href="#实例3：使用proxy服务器及其端口：-x" class="headerlink" title="实例3：使用proxy服务器及其端口：-x"></a>实例3：使用proxy服务器及其端口：-x</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com</div></pre></td></tr></table></figure>
<h3 id="实例4：使用cookie来记录session信息"><a href="#实例4：使用cookie来记录session信息" class="headerlink" title="实例4：使用cookie来记录session信息"></a>实例4：使用cookie来记录session信息</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个option： -D是把http的response里面的cookie信息存到一个特别的文件中去，</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样，当页面被存到page.html的同时，cookie信息也被存到了cookie0001.txt里面了</p>
<h3 id="实例5：下次访问的时候，使用iption把上次的cookie信息追加到http-request里面去：-b"><a href="#实例5：下次访问的时候，使用iption把上次的cookie信息追加到http-request里面去：-b" class="headerlink" title="实例5：下次访问的时候，使用iption把上次的cookie信息追加到http request里面去：-b"></a>实例5：下次访问的时候，使用iption把上次的cookie信息追加到http request里面去：-b</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -x 123.45.6789:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.linuxidc.com</div></pre></td></tr></table></figure>
<h3 id="实例6：浏览器信息"><a href="#实例6：浏览器信息" class="headerlink" title="实例6：浏览器信息"></a>实例6：浏览器信息</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -A <span class="string">"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"</span> -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com</div></pre></td></tr></table></figure>
<h3 id="实例7：referer"><a href="#实例7：referer" class="headerlink" title="实例7：referer"></a>实例7：referer</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -A <span class="string">"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"</span> -x 123.45.67.89:1080 -e <span class="string">"mail.linuxidc.com"</span> -o page.html -D cookie0001.txt http://www.linuxidc.com</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就可以骗对方的服务器，你是从mail.linuxidc.com点击某个连接过来的。</p>
<h3 id="实例8：下载文件"><a href="#实例8：下载文件" class="headerlink" title="实例8：下载文件"></a>实例8：下载文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG</div><div class="line">curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-O可以按照服务器上的文件名，自动存在本地</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG</div></pre></td></tr></table></figure>
<h3 id="实例9：批量下载"><a href="#实例9：批量下载" class="headerlink" title="实例9：批量下载"></a>实例9：批量下载</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -O http://cgi2.tky.3web.ne.jp/~&#123;zzh,nick&#125;/[001-201].JPG</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样产生的下载就是：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">~zzh/001.JPG</div><div class="line">~zzh/002.JPG</div><div class="line">...</div><div class="line">~zzh/201.JPG</div><div class="line">~nick/001.JPG</div><div class="line">~nick/002.JPG</div><div class="line">...</div><div class="line">~nick/201.JPG</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;自定义文件名的批量下载</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -o <span class="comment">#2_#1.jpg http://cgi2.tky.3web.ne.jp/~&#123;zzh,nick&#125;/[001-201].JPG</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样，自定义出来下载下来的文件名就变成了这样：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;原来：<code>~zzh/001.JPG</code>  –&gt; 下载后： <code>001-zzh.JPG</code>  原来： <code>~nick/001.JPG</code> –&gt; 下载后： <code>001-nick.JPG</code></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就不怕文件重名了。</p>
<h3 id="实例10：断点续传"><a href="#实例10：断点续传" class="headerlink" title="实例10：断点续传"></a>实例10：断点续传</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG</div></pre></td></tr></table></figure>
<h3 id="实例11：使用-r-分块下载"><a href="#实例11：使用-r-分块下载" class="headerlink" title="实例11：使用-r 分块下载"></a>实例11：使用-r 分块下载</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;比如有一个 <code>http://cgi2.tky.2web.ne.jp/~zzh/zhao1.MP3</code> 要下载。就可以用这样的命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">curl -r 0-10240 -o <span class="string">"zhao.part1"</span> http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &amp;\</div><div class="line">curl -r 10241-20480 -o <span class="string">"zhao.part1"</span> http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &amp;\</div><div class="line">curl -r 20481-40960 -o <span class="string">"zhao.part1"</span> http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &amp;\</div><div class="line">curl -r 40961- -o <span class="string">"zhao.part1"</span> http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就可以分块下载了。不过需要自己把这些破碎的文件合并起来，如果用UNIX或者苹果，用 <code>cat zhao.part* &gt; zhao.MP3</code> 就可以了；如果用的windows 用 <code>copy /b</code> 来解决。</p>
<h3 id="实例12：使用FTP协议下载"><a href="#实例12：使用FTP协议下载" class="headerlink" title="实例12：使用FTP协议下载"></a>实例12：使用FTP协议下载</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面都是http协议的下载，其实ftp也一样可以用。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -u name:passwd ftp://ip:port/path/file</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;或者</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl ftp://name:passwd@ip:port/path/file</div></pre></td></tr></table></figure>
<h3 id="实例13：使用-T上传"><a href="#实例13：使用-T上传" class="headerlink" title="实例13：使用-T上传"></a>实例13：使用-T上传</h3><h4 id="向ftp传一个文件："><a href="#向ftp传一个文件：" class="headerlink" title="向ftp传一个文件："></a>向ftp传一个文件：</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -T localfile -u name:passwd ftp://upload_site:port/path/</div></pre></td></tr></table></figure>
<h4 id="向http服务器上传文件"><a href="#向http服务器上传文件" class="headerlink" title="向http服务器上传文件"></a>向http服务器上传文件</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意，这个时候，使用协议是HTTP的PUT method</p>
<h3 id="实例14：POST和GET模式"><a href="#实例14：POST和GET模式" class="headerlink" title="实例14：POST和GET模式"></a>实例14：POST和GET模式</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说到PUT，自然还有其它几种methos，POST和GET</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl http://www.linuxidc.com/login.cgi?user=nickwolfe&amp;password=12345</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;POST模式的option是-d</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -d <span class="string">"user=nickwolfe&amp;password=12345"</span> http://www.linuxidc.com/login.cgi</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;需要注意的是，POST模式下的文件上传，比如一个HTTP表单，要用curl进行模拟，就该是:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi</div></pre></td></tr></table></figure>
<h3 id="实例15：http本地证书"><a href="#实例15：http本地证书" class="headerlink" title="实例15：http本地证书"></a>实例15：http本地证书</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -E localcert.pem https://remote_server</div></pre></td></tr></table></figure>
<h3 id="实例16：使用curl通过dict协议去查字典"><a href="#实例16：使用curl通过dict协议去查字典" class="headerlink" title="实例16：使用curl通过dict协议去查字典"></a>实例16：使用curl通过dict协议去查字典</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl dict://dict.org/d:computer</div></pre></td></tr></table></figure>
<h3 id="实例17：获取服务端的信息，比如获取web-Server的类型（apache-nginx）以及版本，php的版本等等"><a href="#实例17：获取服务端的信息，比如获取web-Server的类型（apache-nginx）以及版本，php的版本等等" class="headerlink" title="实例17：获取服务端的信息，比如获取web Server的类型（apache/nginx）以及版本，php的版本等等"></a>实例17：获取服务端的信息，比如获取web Server的类型（apache/nginx）以及版本，php的版本等等</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -i http://example.com/</div></pre></td></tr></table></figure>
<h3 id="实例18：curl指定用户以及密码访问"><a href="#实例18：curl指定用户以及密码访问" class="headerlink" title="实例18：curl指定用户以及密码访问"></a>实例18：curl指定用户以及密码访问</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有时候，访问一个网页时是需要认证的，也就是说需要输入正确的用户名以及密码信息，否则会包401的错误</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -u user:password http://www.linuxidc.com/study/</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就可以了</p>
<h3 id="实例19：在linux上使用curl访问网站，指定主机IP"><a href="#实例19：在linux上使用curl访问网站，指定主机IP" class="headerlink" title="实例19：在linux上使用curl访问网站，指定主机IP"></a>实例19：在linux上使用curl访问网站，指定主机IP</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在linux的命令窗口下，无法使用浏览器去浏览网站，但是可以用curl访问html代码。有时，为了指定某个域名的IP，需要写hosts，比较费事。可以临时用curl命令指定一个IP</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl www.example.com -x192.168.0.111:80</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用 <code>-x</code> 选项指定主机IP，这种方法类似与IE设置了一个代理服务器。但有时候（访问https时）这样访问不太好用，可以使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -H <span class="string">"Host:www.abc.com"</span> https://192.168.0.111/aaa.txt</div></pre></td></tr></table></figure>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/83. Linux 命令- nohup/">Linux 命令- nohup</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在应用Unix/Linux时，我们一般想让某个程序在后台运行，于是我们将常会用 &amp; 在程序结尾来让程序自动运行。比如我们要运行mysql在后台： /usr/local/mysql/bin/mysqld_safe –user=mysql &amp;。可是有很多程序并不想mysqld一样，这样我们就需要nohup命令</p>
<h2 id="命令语法"><a href="#命令语法" class="headerlink" title="命令语法"></a>命令语法</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">nohup <span class="built_in">command</span> [Arg……] [&amp;]</div></pre></td></tr></table></figure>
<h2 id="命令功能"><a href="#命令功能" class="headerlink" title="命令功能"></a>命令功能</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不挂断的运行命令。</p>
<h2 id="命令描述"><a href="#命令描述" class="headerlink" title="命令描述"></a>命令描述</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;nohup命令运行由command参数和任何香断的Arg参数指定的命令，忽略所有挂断（SIGHUP）信号。在注销后使用nohup命令运行后台中的程序。要运行后台中的nohup命令，添加 <code>&amp;</code> （表示“and”的符号）到命令的尾部。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;无论是否将nohup命令的输出重定向到终端，输出都将附加到当前目录的nohup.out文件中。如果当前目录的nohup.out文件不可写，输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加，那么Command参数指定的命令不可调用。如果标准错误是一个终端，那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;退出状态：该命令返回下列出口值：</p>
<ul>
<li>126 可以查找但不能调用Command参数指定的命令。</li>
<li>127 nohup命令发生错误或不能查找有Command参数指定的命令。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;否则，nohup命令的退出状态是Command参数指定命令的退出状态。</p>
<h2 id="nohup命令及其输出文件"><a href="#nohup命令及其输出文件" class="headerlink" title="nohup命令及其输出文件"></a>nohup命令及其输出文件</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果你正在运行一个进程，而且你觉得在退出账户时该进程还不会结束，那么可以使用nohup命令。该命令可以在退出账户或者关闭终端之后继续运行相应的进程。nohup就是不挂起的意思（ no hang up）。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该命令的一般形式为：<code>nohup command &amp;</code></p>
<h2 id="使用nohup命令提交作业"><a href="#使用nohup命令提交作业" class="headerlink" title="使用nohup命令提交作业"></a>使用nohup命令提交作业</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用nohup提交作业，那么在缺省情况下该作业的所有输出都被重定向到一名为nohup.out的文件中，除非另外指定了输出文件：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">nohup <span class="built_in">command</span> &gt; muout.file 2&gt;&amp;1 &amp;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上例中，输出被重定向到myout.file文件中。</p>
<h2 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># cat /usr/local/sbin/sleep.sh</span></div><div class="line"><span class="meta">#! /bin/bash</span></div><div class="line">sleep 1000</div><div class="line">[root@localhost ~]<span class="comment"># nohup sh /usr/local/sbin/sleep.sh &amp;</span></div><div class="line">[1] 19997</div><div class="line">[root@localhost ~]<span class="comment"># nohup: 忽略输入并把输出追加到"nohup.out"</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;直接加一个 <code>&amp;</code> 虽然丢到后台了，但是当退出该终端时很有可能这个脚本也会退出，而在前面加上 <code>nohup</code> 就没有问题了，nohup的作用就是不挂断运行的命令。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/82. Linux 命令- screen/">Linux 命令- screen</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;screen命令用于多重视窗管理程序。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;screen为多重视窗管理程序。所谓的视窗，是指一个全屏幕的文字模式画面。通常只有在使用telnet登入主机或是使用老式终端机时，才有可能用到screen程序。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有时候，也许会有这样的需求。要执行一个命令或者脚本，但是需要几个小时甚至几天。这就要考虑一个问题，就是中途断网或出现其他意外情况，执行的任务中断了怎么办？可以把命令或者脚本丢到后台运行，不过也不保险。screen可以避免这样的问题发生。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;screen中有会话的概念，用户可以在一个screen会话中创建多个screen窗口，在每一个窗口中就想操作一个真实的SSH连接窗口那样。</p>
<h2 id="命令语法"><a href="#命令语法" class="headerlink" title="命令语法"></a>命令语法</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">screen [-AmRvx -ls -wipe][-d &lt;作业名称&gt;][-h &lt;行数&gt;][-r &lt;作业名称&gt;][-s &lt;shell&gt;][-S &lt;作业名称&gt;]</div></pre></td></tr></table></figure>
<h2 id="命令参数"><a href="#命令参数" class="headerlink" title="命令参数"></a>命令参数</h2><ul>
<li>-A 　将所有的视窗都调整为目前终端机的大小。</li>
<li>-d&lt;作业名称&gt; 　将指定的screen作业离线。</li>
<li>-h&lt;行数&gt; 　指定视窗的缓冲区行数。</li>
<li>-m 　即使目前已在作业中的screen作业，仍强制建立新的screen作业。</li>
<li>-r&lt;作业名称&gt; 　恢复离线的screen作业。</li>
<li>-R 　先试图恢复离线的作业。若找不到离线的作业，即建立新的screen作业。</li>
<li>-s<shell> 　指定建立新视窗时，所要执行的shell。</shell></li>
<li>-S&lt;作业名称&gt; 　指定screen作业的名称。</li>
<li>-v 　显示版本信息。</li>
<li>-x 　恢复之前离线的screen作业。</li>
<li>-ls或–list 　显示目前所有的screen作业。</li>
<li>-wipe 　检查目前所有的screen作业，并删除已经无法使用的screen作业。</li>
</ul>
<h2 id="命令实例"><a href="#命令实例" class="headerlink" title="命令实例"></a>命令实例</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果没有screen命令需先安装</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y screen</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;创建screen终端</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># screen</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;创建 screen 终端 ，并执行 vi命令</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># screen vi ~/main.c </span></div><div class="line"></div><div class="line"><span class="comment">#include </span></div><div class="line"></div><div class="line">main ()</div><div class="line">&#123;</div><div class="line"></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="string">"~/mail.c"</span>       0,0-1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <code>Ctrl+a</code> 再按d键，退出该screen回话，只是退出，并没有结束。需要结束的话输入 <code>Ctrl+d</code> 或者输入 <code>exit</code></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <code>screen -ls</code> 查看已经打开的screen会话</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># screen -ls</span></div><div class="line">There is a screen on:</div><div class="line">20001.pts-0.localhost (Attached)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;退出后还想再次登录某个screen会话，使用 <code>sreen -r [screen编号]</code> ，这个编号就是上例中那个20001.当只有一个screen会话时，后面的编号是可以省略的。当有某个需要长时间运行的命令或者脚本时就打开一个screen会话，然后运行该任务。按 <code>ctrl+a d</code>退出会话，不影响终端窗口上的任何操作。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;创建新的screen是可以指定自定义名称的</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># screen -S yanyi</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要想进入该screen，可以直接</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">screen -r yanyi</div></pre></td></tr></table></figure>
<h2 id="screen源码编译安装"><a href="#screen源码编译安装" class="headerlink" title="screen源码编译安装"></a>screen源码编译安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@host1 src]<span class="comment"># wget ftp://ftp.gnu.org/pub/gnu/screen/screen-4.0.3.tar.gz</span></div><div class="line">[root@host1 src]<span class="comment"># tar -xvf screen-4.0.3.tar.gz</span></div><div class="line">[root@host1 src]<span class="comment"># cd screen-4.0.3</span></div><div class="line">[root@host1 screen-4.0.2]<span class="comment"># ./configure</span></div><div class="line">[root@host1 screen-4.0.2]<span class="comment"># make</span></div><div class="line">[root@host1 screen-4.0.2]<span class="comment"># make install</span></div><div class="line">[root@host1 screen-4.0.2]<span class="comment"># install -m 644 etc/etcscreenrc /etc/screenrc</span></div><div class="line">[root@host1 screen-4.0.2]<span class="comment"># cp ./screen /bin</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意和一般程序的安装过程有所不同，后面两条命令一定要执行。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/81. iptables详解/">iptables详解</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<h2 id="iptables简介"><a href="#iptables简介" class="headerlink" title="iptables简介"></a>iptables简介</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;netfilter/iptables（简称为iptables）组成Linux平台下的包过滤防火墙，与大多数的Linux软件一样，这个包过滤防火墙是免费的，它可以代替昂贵的商业防火墙解决方案，完成封包过滤、封包重定向和网络地址转换（NAT）等功能。</p>
<h2 id="iptables基础"><a href="#iptables基础" class="headerlink" title="iptables基础"></a>iptables基础</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;规则（rules）其实就是网络管理员预定义的条件，规则一般的定义为“如果数据包头符合这样的条件，就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中，这些规则分别指定了源地址、目的地址、传输协议（如TCP、UDP、ICMP）和服务类型（如HTTP、FTP和SMTP）等。当数据包与规 则匹配时，iptables就根据规则所定义的方法来处理这些数据包，如放行（accept）、拒绝（reject）和丢弃（drop）等。配置防火墙的 主要工作就是添加、修改和删除这些规则。</p>
<h2 id="iptables和netfilter的关系"><a href="#iptables和netfilter的关系" class="headerlink" title="iptables和netfilter的关系"></a>iptables和netfilter的关系</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;iptables和netfilter的关系是一个很容易让人搞不清的问题，很多知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已，位于/sbin/iptbles。真正实现防火墙功能的是netfilter，它是Linux内核中实现包过滤的内部结构。iptables只是netfilter的一个实现工具。</p>
<h2 id="iptables语法格式"><a href="#iptables语法格式" class="headerlink" title="iptables语法格式"></a>iptables语法格式</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables [-t 表名] [命令选项] [链名] [条件匹配] [-j 目标动作或跳转]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：表名、链名、用户指定iptables命令所操作的表和链，命令选项用于指定管理iptables规则的方式（比如：插入、增加、删除、查看等）；条件匹配用户指定对符合什么样条件的数据包进行处理；目标动作或跳转用于指定数据包的处理方式（比如允许通过、拒绝、丢弃、跳转（jump）给其它链处理）。</p>
<h2 id="iptables控制选项"><a href="#iptables控制选项" class="headerlink" title="iptables控制选项"></a>iptables控制选项</h2><h3 id="基本参数"><a href="#基本参数" class="headerlink" title="基本参数"></a>基本参数</h3><ul>
<li>-A 在指定链的末尾添加（append）一条新的规则</li>
<li>-D 删除（delete）指定链中的某一条规则，可以按规则序号和内容删除</li>
<li>-I 在指定链中插入（insert）一条新的规则，默认在第一行添加</li>
<li>-R 修改、替换（replace）指定链中的某一条规则，可以按规则序号和内容替换</li>
<li>-L 列出（list）指定链中所有的规则进行查看</li>
<li>-E 重命名用户定义的链，不改变链本身</li>
<li>-F 清空（flush）</li>
<li>-N 新建（new-chain）一条用户自己定义的规则链</li>
<li>-X 删除指定表中用户自定义的规则链（delete-chain）</li>
<li>-P 设置指定链的默认策略（policy）</li>
<li>-Z 将所有表的所有链的字节和数据包计数器清零</li>
<li>-n 使用数字形式（numeric）显示输出结果</li>
<li>-v 查看规则表详细信息（verbose）的信息</li>
<li>-V 查看版本(version)</li>
<li>-h 获取帮助（help）</li>
</ul>
<h3 id="描述规则基本参数"><a href="#描述规则基本参数" class="headerlink" title="描述规则基本参数"></a>描述规则基本参数</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这些规则参数用于描述的协议、源地址、目的地址、允许经过的网络接口，以及如何处理这些数据包。这些描述是对规则的基本描述。</p>
<ul>
<li><p>-p （protocol）指定协议，可以是tcp、udp、或者icmp，可以使用 <strong>all</strong> 来指定所有协议；<br>如果不指定 <strong>-p</strong> 参数，则默认是 <strong>all</strong> 值，这并不明智，请总是明确指定协议名称。<br>可以使用协议名（如tcp），或者是协议值（比如6代表tcp）来指定协议，映射关系查看 <code>/etc/protocols</code> ；<br>还可以使用 <strong>-protocol</strong> 参数代替 <strong>-p</strong> 参数</p>
</li>
<li><p>-s 源地址（source）<br>指定数据包的源地址；<br>参数可以使用IP地址、网络地址、主机名<br>-s 192.168.1.101 指定IP地址，<br>-s 192.168.1.10/24指定网络地址<br>不指定-s参数，就代表所有地址<br>还可以使用 <strong>-src</strong> 或者 <strong>-source</strong></p>
</li>
<li><p>-d 目的地址（destination）<br>指定目的地址<br>参数和-s相同<br>还可以使用 <strong>-dst</strong> 或者 <strong>destination</strong></p>
</li>
<li><p>-j 执行目标（jump to target）<br>指定了当与规则（RUle）匹配时如何处理数据包<br>可能的值是ACCEPT允许、DROP丢掉、REJECT拒绝、QUEUE队列、RETURN返回、MASQUERADE伪装（地址伪装，算是snat中的一种特例，可以实现自动化的snat）<br>还可以指定其他连接（Chain）作为目标</p>
</li>
<li><p>-i 输入接口（input initerface）<br>指定要处理来自哪个接口的数据包（一般指定网卡）<br>这些数据包即将进入 INPUT、FORWARD、PREROUTE链<br>例如：-i etho 指定了要处理经由eth0进入的数据包<br>不指定-i参数，那么将处理进入所有接口的数据包<br>如果出现<code>! -i eth0</code>，那么将处理所有经由eth0意外的接口进入的数据包。<br>出现<code>-i eth+</code>，那么将处理所有经由eth开都的接口进入的数据包<br>还可以使用-in-interface参数</p>
</li>
<li>-o 输出（out interface）<br>指定数据包由哪个接口输出<br>这些数据包即将进入FORWARD、OUTPUT、PORTROUTING链<br>不指定 <strong>-o</strong> 选项，那么系统哈斯那个的所有接口都可以作为输出接口<br>出现 <code>! -o eth0</code> 那么将从 <strong>eth0以外的接口</strong> 输出<br>出现 <code>! eth+</code> ，那么将仅从 <strong>eth开头的接口</strong> 输出<br>还可以使用 <strong>-out-initerface</strong> 参数</li>
</ul>
<h3 id="描述规则扩展参数"><a href="#描述规则扩展参数" class="headerlink" title="描述规则扩展参数"></a>描述规则扩展参数</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对规则有了基本描述以后，有时候还希望指定端口、TCP标志、ICMP类型等内容。</p>
<ul>
<li>–sport 源端口（source port） 针对 -p tcp 或者 -p udp<br>缺省情况下，将匹配所有端口<br>可以指定端口号或者端口名称，（例如，-sport 22 与 -sport ssh）<br><strong>/etc/services</strong> 文件描述了上述映射关系<br>从性能上讲，使用端口号更好<br>使用冒号可以匹配端口范围，如“-sport 22:100”<br>还可以使用 <strong>-source-port</strong> </li>
<li><p>–dport 目的端口（destination port） 针对 -p tcp 或者 -p udp<br>参数和-sport类似<br>还可以使用 <strong>-destination-port</strong></p>
</li>
<li><p>–tcp-flage TCP标志 针对 -p tcp<br>可以指定由逗号分割的多个参数<br>有效值可以是：SYN、ACK、FIN、RST、URG、PSH<br>可以使用 <strong>ALL</strong> 或者 <strong>NONE</strong></p>
</li>
<li>–icmp-type ICMP类型 针对 -p icmp<br>–icmp-type 0 表示Echo Reply<br>–icmp-type 8 表示Echo</li>
</ul>
<h2 id="iptables处理数据包的四种方式"><a href="#iptables处理数据包的四种方式" class="headerlink" title="iptables处理数据包的四种方式"></a>iptables处理数据包的四种方式</h2><ul>
<li>ACCEPT 允许数据包通过</li>
<li>DROP 直接丢弃数据包，不给任何回应信息</li>
<li>REJECT 拒绝数据包通过，必要时会给数据发送端一个响应的信息。</li>
<li>LOG在/var/log/messages文件中记录日志信息，然后将数据包传递给下一条规则</li>
</ul>
<h2 id="iptables传输数据包的过程"><a href="#iptables传输数据包的过程" class="headerlink" title="iptables传输数据包的过程"></a>iptables传输数据包的过程</h2><ol>
<li>当一个数据包进入网卡时，它首先进入PREROUTING链，内核根据数据包目的IP判断是否需要转送出去。 </li>
<li>如果数据包就是进入本机的，它就会沿着图向下移动，到达INPUT链。数据包到了INPUT链后，任何进程都会收到它。本机上运行的程序可以发送数据包，这些数据包会经过OUTPUT链，然后到达POSTROUTING链输出。 </li>
<li>如果数据包是要转发出去的，且内核允许转发，数据包就会如图所示向右移动，经过FORWARD链，然后到达POSTROUTING链输出。</li>
</ol>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/01.png?raw=true" alt=""></figure></p>
<h2 id="iptables的规则表和链"><a href="#iptables的规则表和链" class="headerlink" title="iptables的规则表和链"></a>iptables的规则表和链</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;表（tables）提供的特定的功能，iptables内置了4个表，即filter表、nat表、mangle表、和raw表，分别用于实现包过滤，网络地址转换、包重构（修改）和数据跟踪处理。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;链（chains）是数据包传播的路径，每一条链其实就是众多规则中的一个检查清单，每一条链中可以有一条或数条规则。当一个数据包到达一个链时，iptables就会从链中第一条规则开始检查，看该数据包是否满足规则所定义的条件。如果满足，系统就会根据该条规则所定义的方法处理该数据包；否则iptables将继续检查下一条规则，如果该数据包不符号链中任一条规则，iptables就会根据该链预先定义的默认策略来处理数据包。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5成了四张表五个链了，不过多出来的哪个表用的也不太多，所以基本还是和以前一样。下面是四张表五个链。需要明白这些表和链的关系及作用。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/02.png?raw=true" alt=""></figure></p>
<h2 id="规则表"><a href="#规则表" class="headerlink" title="规则表"></a>规则表</h2><ol>
<li><p>filter表——三个链：INPUT、FORWARD、OUTPUT<br>作用：过滤数据包，内核模块：iptables=_filter</p>
</li>
<li><p>Nat表——三个链：PREROUTING、POSTROUTING、OUTPUT<br>作用：用于网络地址转换（IP、端口），内核模块：iptable_nat</p>
</li>
<li><p>Mangle表——五个链：PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD<br>作用：修改数据包的服务类型、TTL，并且可以配置路由实现QOS，内核模块：iptable_mangle（设置策略时几乎不会用到它）</p>
</li>
<li><p>Raw表——两个链：OUTPUT、PREROUTING<br>作用：决定数据包是否被状态跟踪机制处理，内核模块：iptable_raw（用得不多）</p>
</li>
</ol>
<h2 id="规则链"><a href="#规则链" class="headerlink" title="规则链"></a>规则链</h2><ol>
<li>INPUT——进来的数据包应用此规则链中的策略</li>
<li>OUTPUT——外出的数据包应用此规则链中的策略</li>
<li>ROEWARD——转发数据包时应用此规则链中的策略</li>
<li>PREROUTING——对数据包做路由选择前应用此链中的规则（所有的数据包进来的时候都先由这个链处理）</li>
<li>POSTROUTING——对数据包作路由选择后应用此链中的规则（所有的数据包出来的时候都先由这个链处理）</li>
</ol>
<h2 id="规则表之间的有限顺序"><a href="#规则表之间的有限顺序" class="headerlink" title="规则表之间的有限顺序"></a>规则表之间的有限顺序</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Raw——Mangle——Nat——Filter</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;规则链之间的优先顺序分三种情况</p>
<h3 id="1、入站数据流向"><a href="#1、入站数据流向" class="headerlink" title="1、入站数据流向"></a>1、入站数据流向</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从外界达到防火墙的数据包，先被PREROUTING规则链处理（是否修改数据包地址等），之后会进行路由选择（判断该数据包应该发往何处），如果数据包的目标主机是防火墙本机（比如说internet用户访问防火墙主机中的web服务器的数据包）， 那么内核将其传给INPUT链进行处理（决定是否允许通过等），通过以后再给系统上层的应用程序（比如apache服务器）进行响应。</p>
<h3 id="2、转发数据流向"><a href="#2、转发数据流向" class="headerlink" title="2、转发数据流向"></a>2、转发数据流向</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;来自外界的数据包到达防火墙后，首先被PREROUTING规则链处理，之后会进行路由选择，如果数据包的目标地址是其他外部地址（比如局域网用户通过网关访问QQ站点的数据包），则内核将其传递给FPRWARD链进行处理（是否转发或拦截），然后再交给POSTROUTING规则链（是否修改数据包的地址等）进行处理。</p>
<h3 id="3、出站数据流向"><a href="#3、出站数据流向" class="headerlink" title="3、出站数据流向"></a>3、出站数据流向</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;防火墙本机向外部地下hi发送的数据包（比如在防火墙主机中测试公网DNS服务器时），首先被OUTPUT规则链处理，之后进行路由选择，然后传递给POSTROUTING规则链（是否修改数据包的地址等）进行处理。</p>
<h2 id="管理和设置iptables规则"><a href="#管理和设置iptables规则" class="headerlink" title="管理和设置iptables规则"></a>管理和设置iptables规则</h2><p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/03.jpg?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/iptables%E8%AF%A6%E8%A7%A3/04.jpg?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面针对一个小需求讲述一下这个iptables规则如何设定：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;需求：只针对filter表，预设策略INPUT链DROP，其他两个链ACCEPT，然后针对192.168.137.0/24开通22端口，对所有网段开放80端口，对素有网段开放21端口。这个需求不复制，但是有很多条规则，所以最好写成脚本形式：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># vim /usr/local/sbin/iptables.sh</span></div><div class="line"></div><div class="line"><span class="meta">#!/bin/bash</span></div><div class="line"></div><div class="line">ipt=<span class="string">"/sbin/iptables"</span></div><div class="line"><span class="variable">$ipt</span> -F</div><div class="line"><span class="variable">$ipt</span> -P INPUT DROP</div><div class="line"><span class="variable">$ipt</span> -P OUTPUT ACCEPT</div><div class="line"><span class="variable">$ipt</span> -P FORWARD ACCEPR</div><div class="line"><span class="variable">$ipt</span> -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT</div><div class="line"><span class="variable">$ipt</span> -A INPUT -p tcp --dport 80 -j ACCEPT</div><div class="line"><span class="variable">$ipt</span> -A INPUT -p tcp --dport 21 -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;完成脚本编写后，直接运行即可。如果想开机启动时初始化防火墙规则，需要在 <code>/etc/rc.d/rc.local</code> 中添加一行 <code>/bin/bash /usr/local/sbin/iptables.sh</code></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sh /usr/local/sbin/iptables.sh</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL</span></div><div class="line">Chain INPUT (policy DROP 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination</div><div class="line">   20  1580 ACCEPT     tcp  --  *      *       192.168.137.0/24     0.0.0.0/0           tcp dpt:22</div><div class="line">    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80</div><div class="line">    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:21</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;运行脚本后，查看规则就是这样的，可以看到第一条规则中已经有20个包被放行了。关于icmp的包有一个比较常见的应用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">root@localhost ~]<span class="comment"># iptables -I INPUT -p icmp --icmp-type 8 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>–icmp-type 这个选项是要跟 -p icmp 一起使用的，后i安指定类型编号。这个8指的是能在本机ping同其他机器，而其他机器不能ping通本机。</strong></p>
<h2 id="nat表的应用"><a href="#nat表的应用" class="headerlink" title="nat表的应用"></a>nat表的应用</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其实，linux的iptables功能是十分强大的，曾经有一个老师这样形容Linux的网络功能：只有想不到，没有做不到！也就是说只要能够想到的关于网络的应用，Linux都能实现。在日常生活中使用的路由器，它的功能就是分享上网。本来一跟网线过来（其实只有一个公网IP），通过路由器后，路由器分配了一个网段（私网IP），这样连接路由器的台机器都能连接internet，而远端的设备认为IP就是那个连接路由器的公网IP。这个路由器的功能其实就是有Linux的iptables实现的，而iptables又是通过nat表作用而实现的这个功能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;举个例子来说明iptables如何实现的这个功能。假设机器上有两块网卡etho0和eth1，其中eth0的IP为10.0.2.68，eth1的IP为192.168.1.1.eth0连接了internet，但eth1没有连接，现在有另一台机器（192.168.1.2）和eth1是互通的，那么如何设置也能够让连接eth1的这台机器能够连接internet（即能和10.0.2.68互通）？</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># echo "1" &gt; /proc/sys/net/ipv4/ip_forward</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;就是这样简单的两条命令就能实现上面的需求。第一个命令涉及到了内核参数相关的配置文件，它的目的是为了打开路由转发功能，否则无法实现应用。第二个命令则是iptables对nat表做了一个IP转发的操作，-o选项后跟设备名，表示出口的网卡，MASQUERADE表示伪装的意思。</p>
<h2 id="iptables防火墙规则的保存与恢复"><a href="#iptables防火墙规则的保存与恢复" class="headerlink" title="iptables防火墙规则的保存与恢复"></a>iptables防火墙规则的保存与恢复</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>iptables-save</code>把规则保存到文件中，再由目录rc.d下个脚本（/etc/rc.d/init.d/iptables）自动装载</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用命令<code>iptables-save</code>来保存规则。一般用</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables-save &gt; /etc/sysconfig/iptables</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;生成保存规则的文件/etc/sysconfig/iptables,</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也可以用</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">service iptables save</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;它能把规则自动保存在/etc/sysconfig/iptables中。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当计算机启动时，rc.d下的脚本将用命令iptables-restore调用这个文件，从而就自动恢复了规则。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>-nvL</code>就是查看规则，<code>-F</code>是把当前规则清除，但这个只是临时的，重启系统或者重启iptables服务后还回加载已经保存的规则，所以需要使用<code>/etc/init.d/iptables save</code>保存一下规则</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -F ; /etc/init.d/iptables save</div></pre></td></tr></table></figure>
<h2 id="使用实例"><a href="#使用实例" class="headerlink" title="使用实例"></a>使用实例</h2><h3 id="实例1：查看规则以及清除规则"><a href="#实例1：查看规则以及清除规则" class="headerlink" title="实例1：查看规则以及清除规则"></a>实例1：查看规则以及清除规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -nvL</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -t nat -nvL</span></div><div class="line">Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>-t</code>后面跟表名，<code>-nvL</code>即查看该表的规则，其中<code>-n</code>表示不针对IP反解析主机名；<code>-L</code>表示列出的意思；而<code>-v</code>表示列出的信息更加详细。。如果不加<code>-t</code>，则打印<code>filter</code>表的相关信息：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL</span></div><div class="line">Chain INPUT (policy ACCEPT 121 packets, 9013 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 85 packets, 8828 bytes)</div><div class="line"> pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个和<code>-t filter</code>打印的信息是一样的。</p>
<h3 id="实例2：清除iptables规则"><a href="#实例2：清除iptables规则" class="headerlink" title="实例2：清除iptables规则"></a>实例2：清除iptables规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -F</div><div class="line">iptables -Z</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不加<code>-t</code>默认是针对表<code>filter</code>来操作的，<code>-F</code>表示把所有规则全部删除；<code>-Z</code>表示把包以及流量计数器清零。</p>
<h3 id="实例3：增加一条规则"><a href="#实例3：增加一条规则" class="headerlink" title="实例3：增加一条规则"></a>实例3：增加一条规则</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -s 10.72.11.12 -p tcp --sport 1234 -d 10.72.137.159 --dport 80 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这就是增加一条规则，省略-t所以针对filter表。-A表示增加一条规则，另外还有-I表示插入一条规则，-D删除一条规则；后面个INPUT既链名称，还可以是OUTPUT或者FORWARD；-s后跟源地址；-p协议（tcp、udp、icmp）；<code>--sport/--dport</code>后跟源端口；-d后跟目的IP（主要针对内网或者外网）；-j后跟动作（DROP即把包丢掉，REJECT即包拒绝；ACCEPT即允许包）。</p>
<h3 id="实例4：插入一条规则，把来自1-1-1-1的所有数据包丢掉"><a href="#实例4：插入一条规则，把来自1-1-1-1的所有数据包丢掉" class="headerlink" title="实例4：插入一条规则，把来自1.1.1.1的所有数据包丢掉"></a>实例4：插入一条规则，把来自1.1.1.1的所有数据包丢掉</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -I INPUT -s 1.1.1.1 -j DROP</span></div></pre></td></tr></table></figure>
<h3 id="实例5：删除一条规则"><a href="#实例5：删除一条规则" class="headerlink" title="实例5：删除一条规则"></a>实例5：删除一条规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -D INPUT -s 1.1.1.1 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删除实例4中插入的规则。注意要删除一条规则时，必须和插入的规则一致，也就是说两条iptables命令，除了-I和-D不一样外，其他地方都一样</p>
<h3 id="实例6：把来自2-2-2-2并且是tcp协议到本机80端口的数据包球吊"><a href="#实例6：把来自2-2-2-2并且是tcp协议到本机80端口的数据包球吊" class="headerlink" title="实例6：把来自2.2.2.2并且是tcp协议到本机80端口的数据包球吊"></a>实例6：把来自2.2.2.2并且是tcp协议到本机80端口的数据包球吊</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -I INPUT -s 2.2.2.2 -p tcp --dport 80 -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要注意的是<code>--dport/--sport</code>必须要和<code>-p</code>选项一起使用，否则会出错。</p>
<h3 id="实例7：把发送到10-0-1-14的22端口的数据包丢掉"><a href="#实例7：把发送到10-0-1-14的22端口的数据包丢掉" class="headerlink" title="实例7：把发送到10.0.1.14的22端口的数据包丢掉"></a>实例7：把发送到10.0.1.14的22端口的数据包丢掉</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -I OUTPUT -p tcp --dport 22 -d 10.0.1.14 -j DROP</span></div></pre></td></tr></table></figure>
<h3 id="实例8：把来自192-168-0-0-24这个网段的并且作用在eth0上的数据包都放行"><a href="#实例8：把来自192-168-0-0-24这个网段的并且作用在eth0上的数据包都放行" class="headerlink" title="实例8：把来自192.168.0.0/24这个网段的并且作用在eth0上的数据包都放行"></a>实例8：把来自192.168.0.0/24这个网段的并且作用在eth0上的数据包都放行</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -s 192.168.0.0/24 -i eth0 -j ACCEPT</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL | grep '192.168.0.0/24'</span></div><div class="line">   65  4680 ACCEPT     all  --  eth0   *       192.168.0.0/24       0.0.0.0/0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-I 和 -A 都是增加规则，它们的去区别是。 -A 可以说是往后排，-I 是直接插队到最前面。也就是说 -A 增加的规则是在最后面的，而 -I 增加的规则是在最前面的。数据包流向是从前往后走，所以如果想让一条规则最优先生效，那么就用 -I 插入一条规则。</p>
<h3 id="实例9：iptables删除某一条规则"><a href="#实例9：iptables删除某一条规则" class="headerlink" title="实例9：iptables删除某一条规则"></a>实例9：iptables删除某一条规则</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;iptables过多了，想删除某一条规则时，又不容易掌握当时创建时的规则。其实有一种比较简单的方法:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL --line-numbers</span></div><div class="line">Chain INPUT (policy ACCEPT 12 packets, 648 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       2.2.2.2              0.0.0.0/0           tcp dpt:80 </div><div class="line">2      132  9309 ACCEPT     all  --  eth0   *       192.168.0.0/24       0.0.0.0/0           </div><div class="line"></div><div class="line">Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 90 packets, 8816 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       0.0.0.0/0            10.0.1.14           tcp dpt:22</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删除某一条规则使用如下命令：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -D INPUT 2</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>-D后跟链名，然后是规则num，这个num就是查看iptables规则时第一列的值。</strong>再次查看刚才的规则，INPUT里已经没有第2条了</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL --line-numbers</span></div><div class="line">Chain INPUT (policy ACCEPT 7 packets, 504 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       2.2.2.2              0.0.0.0/0           tcp dpt:80 </div><div class="line"></div><div class="line">Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT 5 packets, 604 bytes)</div><div class="line">num   pkts bytes target     prot opt <span class="keyword">in</span>     out     <span class="built_in">source</span>               destination         </div><div class="line">1        0     0 DROP       tcp  --  *      *       0.0.0.0/0            10.0.1.14           tcp dpt:22</div></pre></td></tr></table></figure>
<h3 id="实例10：接收目标端口为22的数据包"><a href="#实例10：接收目标端口为22的数据包" class="headerlink" title="实例10：接收目标端口为22的数据包"></a>实例10：接收目标端口为22的数据包</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例11：拒绝所有其他数据包"><a href="#实例11：拒绝所有其他数据包" class="headerlink" title="实例11：拒绝所有其他数据包"></a>实例11：拒绝所有其他数据包</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -j DROP</div></pre></td></tr></table></figure>
<h3 id="实例12：iptables-P选项"><a href="#实例12：iptables-P选项" class="headerlink" title="实例12：iptables -P选项"></a>实例12：iptables -P选项</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">root@localhost ~]<span class="comment"># iptables -P INPUT DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-P选项经常用到，表示预设策略。 <strong>-P 后面跟链名，策略内容或者为DROP或者为ACCEPT，默认是ACCEPT。注意：如果在连接远程服务器，千万不要随便敲这个命令，因为一旦钓完回车就会断掉。</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>这个策略一旦设定后，只能使用 <code>iptables -P INPUT ACCEPT</code> 才能恢复成原始状态，而不能使用-F参数。</strong></p>
<h3 id="实例13：iptables实现内网机器访问外网"><a href="#实例13：iptables实现内网机器访问外网" class="headerlink" title="实例13：iptables实现内网机器访问外网"></a>实例13：iptables实现内网机器访问外网</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;环境：两台机器，一台可以访问外网、内网，一台只能访问内网</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;外网机器的外网IP：123.221.20.11；内网IP为：192.168.15.100</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;内网机器IP：192.168.15.101<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置方法：</p>
<ol>
<li>在外网机器上设置iptables规则：</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -t nat -A POSTROUTING -s 192.168.15.101 -j SNAT --to 123.221.20.11</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>注意</strong> :如果想让整个内网的机器全部上网，只需要把 <code>-s 192.168.15.101</code> 换成 <code>-s 192.168.15.0/255.255.255.0</code> 即可</p>
<ol>
<li>在带外网机器上打开转发<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先查看是否已经打开</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sysctl -a | grep 'net.ipv4.ip_forward'</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果值为1，则说明已经打开，否则需要修改匹配文件 <code>/etc/sysctl.conf</code></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;打开该配置文件，找到该参数，使其变为</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">net.ipv4.ip_forward = 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后运行</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sysctl -p</div></pre></td></tr></table></figure>
<ol>
<li>在内网机器上，设置其网关为 192.168.15.100</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># vim /etc/sysconfig/network-scripts/ifcfg-eth0 </span></div><div class="line"></div><div class="line">GATEWAY=192.168.15.100</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;重启网络服务即可</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">service network restart</div></pre></td></tr></table></figure>
<ol>
<li>测试内网机器是否可以上网</li>
</ol>
<h3 id="实例14：iptables限制syn速度"><a href="#实例14：iptables限制syn速度" class="headerlink" title="实例14：iptables限制syn速度"></a>实例14：iptables限制syn速度</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>原理</strong> ：每5s内tcp三次握手大于20次的属于不正常访问。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.0.101 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource</span></div><div class="line">[root@localhost ~]<span class="comment"># iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中192.168.0.0/255.255.255.0为不受限制的网段，192.168.0.101 为本机IP。该iptables策略，可有效预防syn攻击，也可以有效防止机器人发垃圾贴。</p>
<h3 id="实例15：拒绝进入防火墙的所有ICMP协议数据包"><a href="#实例15：拒绝进入防火墙的所有ICMP协议数据包" class="headerlink" title="实例15：拒绝进入防火墙的所有ICMP协议数据包"></a>实例15：拒绝进入防火墙的所有ICMP协议数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -p icmp -j REJECT</div></pre></td></tr></table></figure>
<h3 id="实例16-允许防火墙转发除ICMP协议以外的所有数据包"><a href="#实例16-允许防火墙转发除ICMP协议以外的所有数据包" class="headerlink" title="实例16:允许防火墙转发除ICMP协议以外的所有数据包"></a>实例16:允许防火墙转发除ICMP协议以外的所有数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -p ! icmp -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：使用“!”可以将条件取反</p>
<h3 id="实例17：拒绝转发来自192-168-1-10主机的数据，允许转发来自192-168-0-0-24网段的数据"><a href="#实例17：拒绝转发来自192-168-1-10主机的数据，允许转发来自192-168-0-0-24网段的数据" class="headerlink" title="实例17：拒绝转发来自192.168.1.10主机的数据，允许转发来自192.168.0.0/24网段的数据"></a>实例17：拒绝转发来自192.168.1.10主机的数据，允许转发来自192.168.0.0/24网段的数据</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -s 192.168.1.11 -j REJECT</div><div class="line">iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：注意要把拒绝的放在前面，不然就不起作用了。</p>
<h3 id="实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包"><a href="#实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包" class="headerlink" title="实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包"></a>实例18：丢弃从外网接口（eth1）进入防火墙本机的源地址为私网地址的数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP</div><div class="line">iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP</div><div class="line">iptables -A INPUT -i eth1 -s 10.0.0.0.0/8 -j DROP</div></pre></td></tr></table></figure>
<h3 id="实例19：封堵网段（192-168-1-0-24），两小时后解封"><a href="#实例19：封堵网段（192-168-1-0-24），两小时后解封" class="headerlink" title="实例19：封堵网段（192.168.1.0/24），两小时后解封"></a>实例19：封堵网段（192.168.1.0/24），两小时后解封</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -s 10.20.30.0/24 -j DROP</div><div class="line">iptables -I FORWARD -s 10.20.30.0/24 -j DROP</div><div class="line">at now 2 hours at&gt; iptables -D INPUT 1 at&gt; iptables -D FORWARD 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：这个策略借助crontab计划任务来完成，就再好不过了。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[1]  Stopped  at now 2 hours</div></pre></td></tr></table></figure>
<h3 id="实例20：只允许管理员从202-13-0-0-16网段使用SSH远程登录防火墙主机"><a href="#实例20：只允许管理员从202-13-0-0-16网段使用SSH远程登录防火墙主机" class="headerlink" title="实例20：只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机"></a>实例20：只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT</div><div class="line">iptables -A INPUT -p tcp --dport 22 -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：这个用法比较适合对设备进行远程管理时使用，比如位于分公司中的SQL服务器需要被总公司的管理员管理时。</p>
<h3 id="实例21：允许本机开放从TCP端口20-1024提供的应用服务"><a href="#实例21：允许本机开放从TCP端口20-1024提供的应用服务" class="headerlink" title="实例21：允许本机开放从TCP端口20-1024提供的应用服务"></a>实例21：允许本机开放从TCP端口20-1024提供的应用服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT</div><div class="line">iptables -A INPUT -p tcp --sport 20:1024 -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例22：允许转发来自192-168-0-0-24局域网的DNS解析请求数据包"><a href="#实例22：允许转发来自192-168-0-0-24局域网的DNS解析请求数据包" class="headerlink" title="实例22：允许转发来自192.168.0.0/24局域网的DNS解析请求数据包"></a>实例22：允许转发来自192.168.0.0/24局域网的DNS解析请求数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT</div><div class="line">iptables -A FORWARD -s 192.168.0.0/24 -p udp --sport 53 -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机"><a href="#实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机" class="headerlink" title="实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机"></a>实例23：禁止其他主机ping防火墙主机，但是允许防火墙上ping其他主机</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP</div><div class="line">iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT</div><div class="line">iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT</div></pre></td></tr></table></figure>
<h3 id="实例24：禁止转发来自MAC地址为00-0C-29-27-55-3F的和主机的数据包"><a href="#实例24：禁止转发来自MAC地址为00-0C-29-27-55-3F的和主机的数据包" class="headerlink" title="实例24：禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包"></a>实例24：禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3f -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> :iptables<br>中使用 <code>-m 模块关键字</code> 的形式调用显示匹配。这里用 <code>-m mac --mac-source</code>来表示数据包的源MAC地址。</p>
<h3 id="实例25：允许防火墙本机对外开放TCP端口-20、21、25、110以及被动模式FTP端口1250-1280"><a href="#实例25：允许防火墙本机对外开放TCP端口-20、21、25、110以及被动模式FTP端口1250-1280" class="headerlink" title="实例25：允许防火墙本机对外开放TCP端口 20、21、25、110以及被动模式FTP端口1250-1280"></a>实例25：允许防火墙本机对外开放TCP端口 20、21、25、110以及被动模式FTP端口1250-1280</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：这里使用 <code>-m multiport -dport</code> 来指定目的端口及范围</p>
<h3 id="实例26：禁止转发源IP地址为192-168-1-20-192-168-1-99的TCP数据包"><a href="#实例26：禁止转发源IP地址为192-168-1-20-192-168-1-99的TCP数据包" class="headerlink" title="实例26：禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包"></a>实例26：禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：此处用 <code>-m -iprange --src-range</code>指定IP范围</p>
<h3 id="实例27：禁止转发与正常TCP连接无关的非-syn请求数据包"><a href="#实例27：禁止转发与正常TCP连接无关的非-syn请求数据包" class="headerlink" title="实例27：禁止转发与正常TCP连接无关的非-syn请求数据包"></a>实例27：禁止转发与正常TCP连接无关的非-syn请求数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：<code>-m state</code> 表示数据包的俩节状态，NEW表示与任何 连接无关的，新的嘛！</p>
<h3 id="实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包"><a href="#实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包" class="headerlink" title="实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包"></a>实例28：拒绝访问防火墙的新数据包，但允许响应连接或与已有连接相关的数据包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">iptables -A INPUT -p tcp -m state --state NEW -j DROP</div><div class="line">iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong> ：<code>ESTABLISHED</code> 表示已经响应请求或者已经建立连接的数据包，<code>RELATED</code> 表示与已建立的连接有相关性的，比如FTP数据连接等。</p>
<h3 id="实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理"><a href="#实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理" class="headerlink" title="实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理"></a>实例29：只开放本机的web服务（80）、FTP（20、21、20340-20480），放行外部主机发往服务器其他端口的应答数据包，将其他入站数据包均以丢弃处理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT</div><div class="line">iptables -I INPUT -p tcp --dport 2045:20480 -j ACCEPT</div><div class="line">iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT</div><div class="line">iptables -P INPUT DROP</div></pre></td></tr></table></figure>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/8. Linux 命令- mv/">Linux 命令- mv</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mv命令是move的缩写，可以用来移动文件或者将文件改名（move (rename) files），是Linux系统下常用的命令，经常用来备份文件或者目录。</p>
<h2 id="1．命令格式："><a href="#1．命令格式：" class="headerlink" title="1．命令格式："></a>1．命令格式：</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv [选项] [源文件或目录] [目标文件或目录]</div></pre></td></tr></table></figure>
<h2 id="2．命令功能："><a href="#2．命令功能：" class="headerlink" title="2．命令功能："></a>2．命令功能：</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;视mv命令中第二个参数类型的不同（是目标文件还是目标目录），mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时，mv命令完成文件重命名，此时，源文件只能有一个（也可以是源目录名），它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时，源文件或目录参数可以有多个，mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时，mv先拷贝，再将原有文件删除，而链至该文件的链接也将丢失。</p>
<h2 id="3．命令参数："><a href="#3．命令参数：" class="headerlink" title="3．命令参数："></a>3．命令参数：</h2><ul>
<li>-b ：若需覆盖文件，则覆盖前先行备份。  </li>
<li>-f ：force 强制的意思，如果目标文件已经存在，不会询问而直接覆盖；</li>
<li>-i ：若目标文件 (destination) 已经存在时，就会询问是否覆盖！</li>
<li>-u ：若目标文件已经存在，且 source 比较新，才会更新(update)  </li>
<li>-t  ： –target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY，即指定mv的目标目录，该选项适用于移动多个源文件到一个目录的情况，此时目标目录在前，源文件在后。     </li>
</ul>
<h2 id="4．命令实例："><a href="#4．命令实例：" class="headerlink" title="4．命令实例："></a>4．命令实例：</h2><h3 id="实例1：文件改名"><a href="#实例1：文件改名" class="headerlink" title="实例1：文件改名"></a>实例1：文件改名</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv test.log test1.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">总计 20drwxr-xr-x 6 root root 4096 10-27 01:58 scf</div><div class="line">drwxrwxrwx 2 root root 4096 10-25 17:46 test3</div><div class="line">drwxr-xr-x 2 root root 4096 10-25 17:56 test4</div><div class="line">drwxr-xr-x 3 root root 4096 10-25 17:56 test5</div><div class="line">-rw-r--r-- 1 root root   16 10-28 06:04 test.log</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># mv test.log test1.txt</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">总计 20drwxr-xr-x 6 root root 4096 10-27 01:58 scf</div><div class="line">-rw-r--r-- 1 root root   16 10-28 06:04 test1.txt</div><div class="line">drwxrwxrwx 2 root root 4096 10-25 17:46 test3</div><div class="line">drwxr-xr-x 2 root root 4096 10-25 17:56 test4</div><div class="line">drwxr-xr-x 3 root root 4096 10-25 17:56 test5</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明：</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将文件test.log重命名为test1.txt     </p>
<h3 id="实例2：移动文件"><a href="#实例2：移动文件" class="headerlink" title="实例2：移动文件"></a>实例2：移动文件</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv test1.txt test3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">总计 20drwxr-xr-x 6 root root 4096 10-27 01:58 scf</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">drwxrwxrwx 2 root root 4096 10-25 17:46 test3</div><div class="line">drwxr-xr-x 2 root root 4096 10-25 17:56 test4</div><div class="line">drwxr-xr-x 3 root root 4096 10-25 17:56 test5</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># mv test1.txt test3</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">总计 16drwxr-xr-x 6 root root 4096 10-27 01:58 scf</div><div class="line">drwxrwxrwx 2 root root 4096 10-28 06:09 test3</div><div class="line">drwxr-xr-x 2 root root 4096 10-25 17:56 test4</div><div class="line">drwxr-xr-x 3 root root 4096 10-25 17:56 test5</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test3</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">总计 4</div><div class="line">-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt</div><div class="line">[root@localhost test3]<span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明：</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将test1.txt文件移到目录test3中    </p>
<h3 id="实例3：将文件log1-txt-log2-txt-log3-txt移动到目录test3中。"><a href="#实例3：将文件log1-txt-log2-txt-log3-txt移动到目录test3中。" class="headerlink" title="实例3：将文件log1.txt,log2.txt,log3.txt移动到目录test3中。"></a>实例3：将文件log1.txt,log2.txt,log3.txt移动到目录test3中。</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">mv log1.txt log2.txt log3.txt test3</div><div class="line">mv -t /opt/soft/<span class="built_in">test</span>/test4/ log1.txt log2.txt 	log3.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div></pre></td><td class="code"><pre><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">总计 28</div><div class="line">-rw-r--r-- 1 root root    8 10-28 06:15 log1.txt</div><div class="line">-rw-r--r-- 1 root root   12 10-28 06:15 log2.txt</div><div class="line">-rw-r--r-- 1 root root   13 10-28 06:16 log3.txt</div><div class="line">drwxrwxrwx 2 root root 4096 10-28 06:09 test3</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># mv log1.txt log2.txt log3.txt test3</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">总计 16drwxrwxrwx 2 root root 4096 10-28 06:18 test3</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test3/</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">总计 16</div><div class="line">-rw-r--r-- 1 root root  8 10-28 06:15 log1.txt</div><div class="line">-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt</div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt</div><div class="line">-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt</div><div class="line">[root@localhost test3]<span class="comment">#</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">总计 20</div><div class="line">-rw-r--r-- 1 root root    8 10-28 06:15 log1.txt</div><div class="line">-rw-r--r-- 1 root root   12 10-28 06:15 log2.txt</div><div class="line">-rw-r--r-- 1 root root   13 10-28 06:16 log3.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:21 logs</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">[root@localhost test3]<span class="comment"># mv -t /opt/soft/test/test4/ log1.txt log2.txt 	log3.txt </span></div><div class="line">[root@localhost test3]<span class="comment"># cd ..</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test4/</span></div><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">总计 12</div><div class="line">-rw-r--r-- 1 root root  8 10-28 06:15 log1.txt</div><div class="line">-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt</div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt</div><div class="line">[root@localhost test4]<span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明：</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mv log1.txt log2.txt log3.txt test3 命令将log1.txt ，log2.txt， log3.txt 三个文件移到 test3目录中去，mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt 命令又将三个文件移动到test4目录中去      </p>
<h3 id="实例4：将文件file1改名为file2，如果file2已经存在，则询问是否覆盖"><a href="#实例4：将文件file1改名为file2，如果file2已经存在，则询问是否覆盖" class="headerlink" title="实例4：将文件file1改名为file2，如果file2已经存在，则询问是否覆盖"></a>实例4：将文件file1改名为file2，如果file2已经存在，则询问是否覆盖</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong> </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv -i log1.txt log2.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">总计 12</div><div class="line">-rw-r--r-- 1 root root  8 10-28 06:15 log1.txt</div><div class="line">-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt</div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt</div><div class="line">[root@localhost test4]<span class="comment"># cat log1.txt </span></div><div class="line">odfdfs</div><div class="line">[root@localhost test4]<span class="comment"># cat log2.txt </span></div><div class="line">ererwerwer</div><div class="line">[root@localhost test4]<span class="comment"># mv -i log1.txt log2.txt </span></div><div class="line">mv：是否覆盖“log2.txt”? y</div><div class="line">[root@localhost test4]<span class="comment"># cat log2.txt </span></div><div class="line">odfdfs</div><div class="line">[root@localhost test4]<span class="comment">#</span></div></pre></td></tr></table></figure>
<h3 id="实例5：将文件file1改名为file2，即使file2存在，也是直接覆盖掉"><a href="#实例5：将文件file1改名为file2，即使file2存在，也是直接覆盖掉" class="headerlink" title="实例5：将文件file1改名为file2，即使file2存在，也是直接覆盖掉"></a>实例5：将文件file1改名为file2，即使file2存在，也是直接覆盖掉</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv -f log3.txt log2.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">总计 8</div><div class="line">-rw-r--r-- 1 root root  8 10-28 06:15 log2.txt</div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt</div><div class="line">[root@localhost test4]<span class="comment"># cat log2.txt </span></div><div class="line">odfdfs</div><div class="line">[root@localhost test4]<span class="comment"># cat log3</span></div><div class="line">cat: log3: 没有那个文件或目录</div><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">总计 8</div><div class="line">-rw-r--r-- 1 root root  8 10-28 06:15 log2.txt</div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt</div><div class="line">[root@localhost test4]<span class="comment"># cat log2.txt </span></div><div class="line">odfdfs</div><div class="line">[root@localhost test4]<span class="comment"># cat log3.txt </span></div><div class="line">dfosdfsdfdss</div><div class="line">[root@localhost test4]<span class="comment"># mv -f log3.txt log2.txt </span></div><div class="line">[root@localhost test4]<span class="comment"># cat log2.txt </span></div><div class="line">dfosdfsdfdss</div><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">总计 4</div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt</div><div class="line">[root@localhost test4]<span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明：</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;log3.txt的内容直接覆盖了log2.txt内容，-f 这是个危险的选项，使用的时候一定要保持头脑清晰，一般情况下最好不用加上它。        </p>
<h3 id="实例6：目录的移动"><a href="#实例6：目录的移动" class="headerlink" title="实例6：目录的移动"></a>实例6：目录的移动</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv dir1 dir2</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt</div><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt</div><div class="line">[root@localhost test4]<span class="comment"># cd ..</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">drwxr-xr-x 6 root root 4096 10-27 01:58 scf</div><div class="line">drwxrwxrwx 3 root root 4096 10-28 06:24 test3</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:48 test4</div><div class="line">drwxr-xr-x 3 root root 4096 10-25 17:56 test5</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test3</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:21 logs</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">[root@localhost test3]<span class="comment"># cd ..</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># mv test4 test3</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">drwxr-xr-x 6 root root 4096 10-27 01:58 scf</div><div class="line">drwxrwxrwx 4 root root 4096 10-28 06:54 test3</div><div class="line">drwxr-xr-x 3 root root 4096 10-25 17:56 test5</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test3/</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:21 logs</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:48 test4</div><div class="line">[root@localhost test3]<span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明：</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果目录dir2不存在，将目录dir1改名为dir2；否则，将dir1移动到dir2中。  </p>
<h3 id="实例7：移动当前文件夹下的所有文件到上一级目录"><a href="#实例7：移动当前文件夹下的所有文件到上一级目录" class="headerlink" title="实例7：移动当前文件夹下的所有文件到上一级目录"></a>实例7：移动当前文件夹下的所有文件到上一级目录</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv * ../</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root 25 10-28 07:02 log1.txt</div><div class="line">-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt</div><div class="line">[root@localhost test4]<span class="comment"># mv * ../</span></div><div class="line">[root@localhost test4]<span class="comment"># ll</span></div><div class="line">[root@localhost test4]<span class="comment"># cd ..</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt</div><div class="line">-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:21 logs</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 07:02 test4</div></pre></td></tr></table></figure>
<h3 id="实例8：把当前目录的一个子目录里的文件移动到另一个子目录里"><a href="#实例8：把当前目录的一个子目录里的文件移动到另一个子目录里" class="headerlink" title="实例8：把当前目录的一个子目录里的文件移动到另一个子目录里"></a>实例8：把当前目录的一个子目录里的文件移动到另一个子目录里</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong> </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv test3/*.txt test5</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong>   </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># ll</span></div><div class="line">drwxr-xr-x 6 root root 4096 10-27 01:58 scf</div><div class="line">drwxrwxrwx 4 root root 4096 10-28 07:02 test3</div><div class="line">drwxr-xr-x 3 root root 4096 10-25 17:56 test5</div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test3</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt</div><div class="line">-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:21 logs</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 07:02 test4</div><div class="line">[root@localhost test3]<span class="comment"># cd ..</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># mv test3/*.txt test5</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test5</span></div><div class="line">[root@localhost test5]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt</div><div class="line">-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1</div><div class="line">[root@localhost test5]<span class="comment"># 	cd ..</span></div><div class="line">[root@localhost <span class="built_in">test</span>]<span class="comment"># cd test3/</span></div><div class="line">[root@localhost test3]<span class="comment"># ll</span></div><div class="line">drwxr-xr-x 2 root root 4096 10-28 06:21 logs</div><div class="line">drwxr-xr-x 2 root root 4096 10-28 07:02 test4</div><div class="line">[root@localhost test3]<span class="comment">#</span></div></pre></td></tr></table></figure>
<h3 id="实例9：文件被覆盖前做简单备份，前面加参数-b"><a href="#实例9：文件被覆盖前做简单备份，前面加参数-b" class="headerlink" title="实例9：文件被覆盖前做简单备份，前面加参数-b"></a>实例9：文件被覆盖前做简单备份，前面加参数-b</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令：</strong> </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">mv log1.txt -b log2.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">[root@localhost test5]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root   25 10-28 07:02 log1.txt</div><div class="line">-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1</div><div class="line">[root@localhost test5]<span class="comment"># mv log1.txt -b log2.txt</span></div><div class="line">mv：是否覆盖“log2.txt”? y</div><div class="line">[root@localhost test5]<span class="comment"># ll</span></div><div class="line">-rw-r--r-- 1 root root   25 10-28 07:02 log2.txt</div><div class="line">-rw-r--r-- 1 root root   13 10-28 06:16 log2.txt~</div><div class="line">-rw-r--r-- 1 root root   29 10-28 06:05 test1.txt</div><div class="line">drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1</div><div class="line">[root@localhost test5]<span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明：</strong> </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-b 不接受参数，mv会去读取环境变量VERSION_CONTROL来作为备份策略。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;–backup该选项指定如果目标文件存在时的动作，共有四种备份策略：   </p>
<ol>
<li>CONTROL=none或off : 不备份。    </li>
<li>CONTROL=numbered或t：数字编号的备份    </li>
<li>CONTROL=existing或nil：如果存在以数字编号的备份，则继续编号备份m+1…n：执行mv操作前已存在以数字编号的文件log2.txt.~1~，那么再次执行将产生log2.txt~2~，以次类推。如果之前没有以数字编号的文件，则使用下面讲到的简单备份。      </li>
<li>CONTROL=simple或never：使用简单备份：在被覆盖前进行了简单备份，简单备份只能有一份，再次被覆盖时，简单备份也会被覆盖。</li>
</ol>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/80. Linux 命令- tshark/">Linux 命令- tshark</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在Linux下，当我们需要抓取网络数据包分析时，通常是使用tcpdump抓取网络raw数据包存到一个文件，然后下载到本地使用wireshark界面网络分析工具进行网络包分析。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最近才发现，原来wireshark也提供有Linux命令行工具-tshark。tshark不仅有抓包的功能，还带了解析各种协议的能力。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;tshark是wireshark安装目录下命令行工具</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用tshark可以通过自动化方式调用wireshark</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认机器上是没有安装这个工具的。使用yum安装</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y wireshark</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也可以到<a href="http://www.wireshark.org" target="_blank" rel="external">官网</a>下载源码，<a href="http://www.qtasp.cn/wiresharkcharpt/buildingwireshark.html" target="_blank" rel="external">具体安装方法</a></p>
<h2 id="命令参数"><a href="#命令参数" class="headerlink" title="命令参数"></a>命令参数</h2><h3 id="1-抓包接口类"><a href="#1-抓包接口类" class="headerlink" title="1. 抓包接口类"></a>1. 抓包接口类</h3><ul>
<li>-i 设置抓包的网络接口，不设置则默认为第一个非自环接口。</li>
<li>-D 列出当前存在的网络接口。在不了解OS所控制的网络设备时，一般先用“tshark -D”查看网络接口的编号以供-i参数使用。</li>
<li>-f 设定抓包过滤表达式（capture filter expression）。抓包过滤表达式的写法雷同于tcpdump，可参考tcpdump man page的有关部分。</li>
<li>-s 设置每个抓包的大小，默认为65535，多于这个大小的数据将不会被程序记入内存、写入文件。（这个参数相当于tcpdump的-s，tcpdump默认抓包的大小仅为68）</li>
<li>-p 设置网络接口以非混合模式工作，即只关心和本机有关的流量。</li>
<li>-B 设置内核缓冲区大小，仅对windows有效。</li>
<li>-y 设置抓包的数据链路层协议，不设置则默认为-L找到的第一个协议，局域网一般是EN10MB等。</li>
<li>-L 列出本机支持的数据链路层协议，供-y参数使用。  </li>
</ul>
<h3 id="2-抓包停止条件"><a href="#2-抓包停止条件" class="headerlink" title="2. 抓包停止条件"></a>2. 抓包停止条件</h3><ul>
<li>-c 抓取的packet数，在处理一定数量的packet后，停止抓取，程序退出。</li>
<li>-a 设置tshark抓包停止向文件书写的条件，事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式，如“-a duration:5”表示tshark启动后在5秒内抓包然后停止；“-a filesize:10”表示tshark在输出文件达到10kB后停止；“-a files:n”表示tshark在写满n个文件后停止。（windows版的tshark0.99.3用参数“-a files:n”不起作用——会有无数多个文件生成。由于-b参数有自己的files参数，所谓“和-b的其它参数结合使用”无从说起。这也许是一个bug，或tshark的man page的书写有误。）</li>
</ul>
<h3 id="3-文件输出控制"><a href="#3-文件输出控制" class="headerlink" title="3. 文件输出控制"></a>3. 文件输出控制</h3><ul>
<li>-b 设置ring buffer文件参数。ring buffer的文件名由-w参数决定。-b参数采用test:value的形式书写。“-b duration:5”表示每5秒写下一个ring buffer文件；“-b filesize:5”表示每达到5kB写下一个ring buffer文件；“-b files:7”表示ring buffer文件最多7个，周而复始地使用，如果这个参数不设定，tshark会将磁盘写满为止。</li>
</ul>
<h3 id="4-文件输入"><a href="#4-文件输入" class="headerlink" title="4. 文件输入"></a>4. 文件输入</h3><ul>
<li>-r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量，又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。</li>
</ul>
<h3 id="5-处理类"><a href="#5-处理类" class="headerlink" title="5. 处理类"></a>5. 处理类</h3><ul>
<li>-R 设置读取（显示）过滤表达式（read filter expression）。不符合此表达式的流量同样不会被写入文件。注意，读取（显示）过滤表达式的语法和底层相关的抓包过滤表达式语法不相同，它的语法表达要丰富得多，请参考<a href="http://www.ethereal.com/docs/dfref/和http://www.ethereal.com/docs/man-pages/ethereal-filter.4.html。类似于抓包过滤表达式，在命令行使用时最好将它们quote起来。" target="_blank" rel="external">http://www.ethereal.com/docs/dfref/和http://www.ethereal.com/docs/man-pages/ethereal-filter.4.html。类似于抓包过滤表达式，在命令行使用时最好将它们quote起来。</a></li>
<li>-n 禁止所有地址名字解析（默认为允许所有）。</li>
<li>-N 启用某一层的地址名字解析。“m”代表MAC层，“n”代表网络层，“t”代表传输层，“C”代表当前异步DNS查找。如果-n和-N参数同时存在，-n将被忽略。如果-n和-N参数都不写，则默认打开所有地址名字解析。</li>
<li>-d 将指定的数据按有关协议解包输出。如要将tcp 8888端口的流量按http解包，应该写为“-d tcp.port==8888,http”。注意选择子和解包协议之间不能留空格。</li>
</ul>
<h3 id="6-输出类"><a href="#6-输出类" class="headerlink" title="6. 输出类"></a>6. 输出类</h3><ul>
<li>-w 设置raw数据的输出文件。这个参数不设置，tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件，使用重定向“&gt;”而不要-w参数。</li>
<li>-F 设置输出raw数据的格式，默认为libpcap。“tshark -F”会列出所有支持的raw格式。</li>
<li>-V 设置将解码结果的细节输出，否则解码结果仅显示一个packet一行的summary。</li>
<li>-x 设置在解码输出结果中，每个packet后面以HEX dump的方式显示具体数据。</li>
<li>-T 设置解码结果输出的格式，包括text,ps,psml和pdml，默认为text。</li>
<li>-t 设置解码结果的时间格式。“ad”表示带日期的绝对时间，“a”表示不带日期的绝对时间，“r”表示从第一个包到现在的相对时间，“d”表示两个相邻包之间的增量时间（delta）。</li>
<li>-S 在向raw文件输出的同时，将解码结果打印到控制台。</li>
<li>-l 在处理每个包时即时刷新输出。</li>
<li>-X 扩展项。</li>
<li>-q 设置安静的stdout输出（例如做统计时）</li>
<li>-z 设置统计参数。</li>
</ul>
<h3 id="7-其它"><a href="#7-其它" class="headerlink" title="7. 其它"></a>7. 其它</h3><ul>
<li>-h 显示命令行帮助。</li>
<li>-v 显示tshark的版本信息。</li>
<li>-o 重载选项。</li>
</ul>
<h2 id="使用实例"><a href="#使用实例" class="headerlink" title="使用实例"></a>使用实例</h2><h3 id="实例1：显示访问http请求的域名以及URI"><a href="#实例1：显示访问http请求的域名以及URI" class="headerlink" title="实例1：显示访问http请求的域名以及URI"></a>实例1：显示访问http请求的域名以及URI</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tshark -n -t a -R http.request -T fields -e <span class="string">"frame.time"</span> -e <span class="string">"ip.src"</span> -e <span class="string">"http.host"</span> -e <span class="string">"http.request.method"</span> -e <span class="string">"http.request.uri"</span></div></pre></td></tr></table></figure>
<h3 id="实例2：抓取mysql的查询"><a href="#实例2：抓取mysql的查询" class="headerlink" title="实例2：抓取mysql的查询"></a>实例2：抓取mysql的查询</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tshark -n -i eth1 -R <span class="string">'mysql.query'</span> -T fields -e <span class="string">"ip.src"</span> -e <span class="string">"mysql.query"</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>另外一种方法</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tshark -i eth1 port 3307 -d tcp.port==3307,mysql -z <span class="string">"proto,colinfo,mysql.query,mysql.query"</span></div></pre></td></tr></table></figure>
<h3 id="实例3：抓取指定类型的mysql查询"><a href="#实例3：抓取指定类型的mysql查询" class="headerlink" title="实例3：抓取指定类型的mysql查询"></a>实例3：抓取指定类型的mysql查询</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tshark -n -i eth1 -R <span class="string">'mysql matches "SELECT|INSERT|DELETE|UPDATE"'</span> -T fields -e <span class="string">"ip.src"</span> -e <span class="string">"mysql.query"</span></div></pre></td></tr></table></figure>
<h3 id="实例4：统计http的状态"><a href="#实例4：统计http的状态" class="headerlink" title="实例4：统计http的状态"></a>实例4：统计http的状态</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tshark -n -q -z http,<span class="built_in">stat</span>, -z http,tree</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>注意</strong>：这个命令，直到ctrl+e才会显示出结果</p>
<h3 id="实例5：tshark增加时间标签"><a href="#实例5：tshark增加时间标签" class="headerlink" title="实例5：tshark增加时间标签"></a>实例5：tshark增加时间标签</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">tshark -t ad</div><div class="line">tshark -t a</div></pre></td></tr></table></figure>
<h3 id="实例6：查看当前服务器的web请求"><a href="#实例6：查看当前服务器的web请求" class="headerlink" title="实例6：查看当前服务器的web请求"></a>实例6：查看当前服务器的web请求</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tshark -n -t a -R http.request -T fields -e <span class="string">"frame.time"</span> -e <span class="string">"ip.src"</span> -e <span class="string">"http.host"</span> -e <span class="string">"http.request.method"</span> -e <span class="string">"http.request.uri"</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;tshark主要掌握这一个用法即可。这条命令用于web服务器，可以显示下面信息：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@lnmp ~]<span class="comment"># tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"</span></div><div class="line">Running as user <span class="string">"root"</span> and group <span class="string">"root"</span>. This could be dangerous.</div><div class="line">Capturing on eth0</div><div class="line">Jul 13, 2017 22:00:25.129421639 192.168.0.100   prtas.videocc.net       GET     /v1/view?pid=1499954712122X1245558&amp;uid=04ad877579&amp;vid=04ad877579e0b8ab39e6eafe7709cdf6_0&amp;flow=12074276&amp;pd=1&amp;sd=89&amp;ts=1499954802350&amp;sign=3916b818465aa3ffcb7c81773bc8805f&amp;session_id=&amp;param1=&amp;param2=&amp;param3=&amp;param4=&amp;param5=&amp;cts=0&amp;duration=1004&amp;href=http%3A%2F%2Fv.apelearn.com%2Fstudent.php%3Fview_unit%3D897</div><div class="line">Jul 13, 2017 22:00:27.449646478         [FF02::C]:1900  M-SEARCH        *</div><div class="line">Jul 13, 2017 22:00:31.449976172         [FF02::C]:1900  M-SEARCH        *</div><div class="line">Jul 13, 2017 22:00:34.449975277         [FF02::C]:1900  M-SEARCH        *</div><div class="line">Jul 13, 2017 22:00:35.194957223 192.168.0.100   prtas.videocc.net       GET</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这类似于web访问日志，有时候若服务器没有配置访问日志，可以临时使用该命令查看一下当前服务器的web请求。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/79. Linux 命令- tcpdump/">Linux 命令- tcpdump</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;tcpdump是一个用于截取网络分组，并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略，使其成为类UNIX系统下用于网络分析和问题排查的首选工具。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;tcpdump提供了源代码，公开了接口，因此具备很强的可扩展性，对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中，由于它需要将网络界面设置为混杂模式，普通用户不能正常执行，但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁，而是对网络上的其他计算机的安全存在威胁。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有时候也许有这样的需求，想看一下某个网卡上都有哪些数据包，尤其是当初判定服务器上有流量攻击。这时使用tcpdump来抓一下数据包，就可以知道有哪些IP在攻击了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果系统没有tcpdump这个命令需要用yum安装一下。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y tcpdump</div></pre></td></tr></table></figure>
<h2 id="命令格式"><a href="#命令格式" class="headerlink" title="命令格式"></a>命令格式</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump [-nn] [-i 接口] [-w 存储档名] [-c 次数] [-Ae] [-qX] [-r 文件] [所欲捕获的数据内容]</div></pre></td></tr></table></figure>
<h2 id="命令参数"><a href="#命令参数" class="headerlink" title="命令参数"></a>命令参数</h2><ul>
<li>-A 以ASCII格式打印出所有分组，并将链路层的头最小化。 </li>
<li>-c 在收到指定的数量的分组后，tcpdump就会停止。 </li>
<li>-C 在将一个原始分组写入文件之前，检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小，则关闭当前文件，然后在打开一个新的文件。参数 file_size 的单位是兆字节（是1,000,000字节，而不是1,048,576字节）。 </li>
<li>-d 将匹配信息包的代码以人们能够理解的汇编格式给出。 </li>
<li>-dd 将匹配信息包的代码以c语言程序段的格式给出。 </li>
<li>-ddd 将匹配信息包的代码以十进制的形式给出。 </li>
<li>-D 打印出系统中所有可以用tcpdump截包的网络接口。 </li>
<li>-e 在输出行打印出数据链路层的头部信息。 </li>
<li>-E 用spi@ipaddr algo:secret解密那些以addr作为地址，并且包含了安全参数索引值spi的IPsec ESP分组。 </li>
<li>-f 将外部的Internet地址以数字的形式打印出来。 </li>
<li>-F 从指定的文件中读取表达式，忽略命令行中给出的表达式。 </li>
<li>-i 指定监听的网络接口。 </li>
<li>-l 使标准输出变为缓冲行形式，可以把数据导出到文件。 </li>
<li>-L 列出网络接口的已知数据链路。 </li>
<li>-m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次，以导入多个MIB模块。 </li>
<li>-M 如果tcp报文中存在TCP-MD5选项，则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要（详情可参考RFC 2385）。 </li>
<li>-b 在数据-链路层上选择协议，包括ip、arp、rarp、ipx都是这一层的。</li>
<li>-n 不把网络地址转换成名字。</li>
<li>-nn 不进行端口名称的转换。</li>
<li>-N 不输出主机名中的域名部分。例如，‘nic.ddn.mil‘只输出’nic‘。 </li>
<li>-t 在输出的每一行不打印时间戳。 </li>
<li>-O 不运行分组分组匹配（packet-matching）代码优化程序。 </li>
<li>-P 不将网络接口设置成混杂模式。 </li>
<li>-q 快速输出。只输出较少的协议信息。 </li>
<li>-r 从指定的文件中读取包(这些包一般通过-w选项产生)。 </li>
<li>-S 将tcp的序列号以绝对值形式输出，而不是相对值。 </li>
<li>-s 从每个分组中读取最开始的snaplen个字节，而不是默认的68个字节。 </li>
<li>-T 将监听到的包直接解释为指定的类型的报文，常见的类型有rpc远程过程调用）和snmp（简单网络管理协议；）。 </li>
<li>-t 不在每一行中输出时间戳。 </li>
<li>-tt 在每一行中输出非格式化的时间戳。 </li>
<li>-ttt 输出本行和前面一行之间的时间差。 </li>
<li>-tttt 在每一行中输出由date处理的默认格式的时间戳。 </li>
<li>-u 输出未解码的NFS句柄。 </li>
<li>-v 输出一个稍微详细的信息，例如在ip包中可以包括ttl和服务类型的信息。 </li>
<li>-vv 输出详细的报文信息。 </li>
<li>-w 直接将分组写入文件中，而不是不分析并打印出来。</li>
</ul>
<h2 id="命令功能"><a href="#命令功能" class="headerlink" title="命令功能"></a>命令功能</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;顾名思义，tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。他支持针对网络层、协议、主机、网络或端口的过滤，并提供and、or、not等逻辑语句来帮助去掉无用的信息。</p>
<h2 id="tcpdump的表达式"><a href="#tcpdump的表达式" class="headerlink" title="tcpdump的表达式"></a>tcpdump的表达式</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;表达式是一个正则表达式，tcpdump利用它作为过滤报文的条件，如果一个报文满足表 达式的条件，则这个报文将会被捕获。如果没有给出任何条件，则网络上所有的信息包 将会被截获。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在表达式中一般如下几种类型的关键字：</p>
<h3 id="第一种是关于类型的关键字"><a href="#第一种是关于类型的关键字" class="headerlink" title="第一种是关于类型的关键字"></a>第一种是关于类型的关键字</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;主要包括host、net、prot，例如host 210.27.48.2 ，指明210.27.48.2是一台主机，net202.0.0.0指明202.0.0.0是一个网络地址，port 23 指明端口号是23.如果没有指定类型，缺省的类型是host。</p>
<h3 id="第二种是确定传输方向的关键字"><a href="#第二种是确定传输方向的关键字" class="headerlink" title="第二种是确定传输方向的关键字"></a>第二种是确定传输方向的关键字</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;主要包括src、dst、dst or src、dst and src，这些关键字指明了传输的方向。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;举例说明，src 210.27.48.2，指明ip包中源地址是210.27.48.2，dst net 202.0.0.0指明目的网络地址是202.0.0.0.如果没有指明方向关键字，则缺省是src or dst关键字。</p>
<h3 id="第三种是协议的关键字"><a href="#第三种是协议的关键字" class="headerlink" title="第三种是协议的关键字"></a>第三种是协议的关键字</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;主要包括fddi、ip、arp、rarp、tcp、udp等类型。fddi指明是在FDDI（分布式光纤数据接口网络）上的特定的网络协议，实际上它是“ether”的别名，fddi和ether具有类似的源地址和目的地址，所以可以将fddi协议包当作ether包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议，则tcpdump将会监听所有协议的信息包。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除了这三种类型的关键字之外，其他重要的关键字如下：gateway、breadcast、less、greater，还有三种逻辑运算，取非运算是‘not’ ‘!’，与运算是‘and’，‘&amp;&amp;’；或运算是‘or’，‘&amp;#124；……#124;’；这些关键字可以组合起来构成强大的组合条件来满足人们的需要。</p>
<h2 id="输出结果介绍"><a href="#输出结果介绍" class="headerlink" title="输出结果介绍"></a>输出结果介绍</h2><h3 id="数据链路层头信息"><a href="#数据链路层头信息" class="headerlink" title="数据链路层头信息"></a>数据链路层头信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump --e host localhost</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;localhost 是一台linux主机。它的MAC地址是0：90：27：58：AF：1A H219是一台装有Solaris的SUN工作站。它的MAC地址是8：0：20：79：5B：46； 上一条命令的输出结果如下所示：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">21:50:12.847509 eth0 &lt; 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 &gt; ICE. telne t 0:0(0) ack 22535 win 8760 (DF)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;21：50：12是显示的时间， 847509是ID号，eth0 &lt;表示从网络接口eth0接收该分组， eth0 &gt;表示从网络接口设备发送分组， 8:0:20:79:5b:46是主机H219的MAC地址， 它表明是从源地址H219发来的分组. 0:90:27:58:af:1a是主机ICE的MAC地址， 表示该分组的目的地址是ICE。 ip 是表明该分组是IP分组，60 是分组的长度， h219.33357 &gt; ICE. telnet 表明该分组是从主机H219的33357端口发往主机ICE的 TELNET(23)端口。 ack 22535 表明对序列号是222535的包进行响应。 win 8760表明发 送窗口的大小是8760。</p>
<h3 id="ARP包的tcpdump输出信息"><a href="#ARP包的tcpdump输出信息" class="headerlink" title="ARP包的tcpdump输出信息"></a>ARP包的tcpdump输出信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump arp</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;输出结果</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">22:32:42.802509 eth0 &gt; arp who-has route tell ICE (0:90:27:58:af:1a)</div><div class="line">22:32:42.802902 eth0 &lt; arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;22:32:42是时间戳， 802509是ID号， eth0 &gt;表明从主机发出该分组，arp表明是ARP请求包， who-has route tell ICE表明是主机ICE请求主机route的MAC地址。 0:90:27:58:af:1a是主机 ICE的MAC地址。</p>
<h3 id="TCP包的输出信息"><a href="#TCP包的输出信息" class="headerlink" title="TCP包的输出信息"></a>TCP包的输出信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用tcpdump捕获的TCP包的一般输出信息是：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">src &gt; dst: flags data-seqno ack window urgent options</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;src &gt; dst:表明从源地址到目的地址， flags是TCP报文中的标志信息，S 是SYN标志， F (FIN)， P (PUSH) ， R (RST) “.” (没有标记); data-seqno是报文中的数据 的顺序号， ack是下次期望的顺序号， window是接收缓存的窗口大小， urgent表明 报文中是否有紧急指针。 Options是选项。 </p>
<h3 id="UDP包的输出信息"><a href="#UDP包的输出信息" class="headerlink" title="UDP包的输出信息"></a>UDP包的输出信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用tcpdump捕获的UDP包的一般输出信息是： </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">route.port1 &gt; ICE.port2: udp lenth</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;UDP十分简单，上面的输出行表明从主机route的port1端口发出的一个UDP报文 到主机ICE的port2端口，类型是UDP， 包的长度是lenth。 </p>
<h2 id="使用实例"><a href="#使用实例" class="headerlink" title="使用实例"></a>使用实例</h2><h3 id="实例1：默认启动"><a href="#实例1：默认启动" class="headerlink" title="实例1：默认启动"></a>实例1：默认启动</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># tcpdump</span></div><div class="line">tcpdump: verbose output suppressed, use -v or -vv <span class="keyword">for</span> full protocol decode</div><div class="line">listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes</div><div class="line">12:53:58.186853 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 2571645771:2571645967, ack 2817097466, win 141, length 196</div><div class="line">12:53:58.187498 IP 192.168.0.73.43721 &gt; www.routerlogin.com.domain: 13011+ PTR? 100.0.168.192.in-addr.arpa. (44)</div><div class="line">12:53:58.193280 IP www.routerlogin.com.domain &gt; 192.168.0.73.43721: 13011 NXDomain* 0/1/0 (93)</div><div class="line">12:53:58.193391 IP 192.168.0.73.54701 &gt; www.routerlogin.com.domain: 55618+ PTR? 73.0.168.192.in-addr.arpa. (43)</div><div class="line">12:53:58.198669 IP www.routerlogin.com.domain &gt; 192.168.0.73.54701: 55618 NXDomain* 0/1/0 (92)</div><div class="line">12:53:58.198775 IP 192.168.0.73.39373 &gt; www.routerlogin.com.domain: 10426+ PTR? 1.0.168.192.in-addr.arpa. (42)</div><div class="line">12:53:58.200468 IP www.routerlogin.com.domain &gt; 192.168.0.73.39373: 10426- 1/0/0 PTR www.routerlogin.com. (75)</div><div class="line">12:53:58.200515 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 196:376, ack 1, win 141, length 180</div><div class="line">12:53:58.200595 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 376, win 256, length 0</div><div class="line">12:53:58.208513 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 376:1276, ack 1, win 141, length 900</div><div class="line">12:53:58.224403 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 1276:1440, ack 1, win 141, length 164</div><div class="line">12:53:58.224597 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 1440, win 252, length 0</div><div class="line">12:53:58.239996 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 1440:1700, ack 1, win 141, length 260</div><div class="line">12:53:58.255361 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 1700:1864, ack 1, win 141, length 164</div><div class="line">12:53:58.255508 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 1864, win 256, length 0</div><div class="line">12:53:58.271142 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 1864:2124, ack 1, win 141, length 260</div><div class="line">12:53:58.286589 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 2124:2288, ack 1, win 141, length 164</div><div class="line">12:53:58.286754 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 2288, win 254, length 0</div><div class="line">12:53:58.286912 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 2288:2548, ack 1, win 141, length 260</div><div class="line">12:53:58.302161 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 2548:2712, ack 1, win 141, length 164</div><div class="line">12:53:58.302377 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 2712, win 253, length 0</div><div class="line">12:53:58.302462 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 2712:2972, ack 1, win 141, length 260</div><div class="line">12:53:58.317893 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 2972:3136, ack 1, win 141, length 164</div><div class="line">12:53:58.318078 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 3136, win 251, length 0</div><div class="line">12:53:58.318149 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 3136:3300, ack 1, win 141, length 164</div><div class="line">12:53:58.333352 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 3300:3560, ack 1, win 141, length 260</div><div class="line">12:53:58.333507 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 3560, win 256, length 0</div><div class="line">12:53:58.348907 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 3560:3820, ack 1, win 141, length 260</div><div class="line">12:53:58.366358 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 3820:3984, ack 1, win 141, length 164</div><div class="line">12:53:58.366514 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 3984, win 254, length 0</div><div class="line">12:53:58.381239 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 3984:4244, ack 1, win 141, length 260</div><div class="line">12:53:58.396759 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 4244:4408, ack 1, win 141, length 164</div><div class="line">12:53:58.396965 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 4408, win 253, length 0</div><div class="line">12:53:58.412465 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 4408:4668, ack 1, win 141, length 260</div><div class="line">12:53:58.428078 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 4668:4832, ack 1, win 141, length 164</div><div class="line">12:53:58.428276 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 4832, win 251, length 0</div><div class="line">12:53:58.443786 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 4832:5092, ack 1, win 141, length 260</div><div class="line">12:53:58.459211 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 5092:5256, ack 1, win 141, length 164</div><div class="line">12:53:58.459444 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 5256, win 256, length 0</div><div class="line">12:53:58.474768 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 5256:5516, ack 1, win 141, length 260</div><div class="line">12:53:58.490445 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 5516:5680, ack 1, win 141, length 164</div><div class="line">12:53:58.490611 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 5680, win 254, length 0</div><div class="line">12:53:58.490693 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 5680:5940, ack 1, win 141, length 260</div><div class="line">12:53:58.490904 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 5940:6104, ack 1, win 141, length 164</div><div class="line">12:53:58.491013 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [.], ack 6104, win 253, length 0</div><div class="line">12:53:58.506024 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 6104:6364, ack 1, win 141, length 260</div><div class="line">12:53:58.516922 IP 192.168.0.100.49602 &gt; 192.168.0.73.ssh: Flags [P.], seq 1:53, ack 6364, win 252, length 52</div><div class="line">12:53:58.517035 IP 192.168.0.73.ssh &gt; 192.168.0.100.49602: Flags [P.], seq 6364:6528, ack 53, win 141, length 164</div><div class="line">^C</div><div class="line">48 packets captured</div><div class="line">51 packets received by filter</div><div class="line">0 packets dropped by kernel</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;普通情况下，直接启动tcpdump将监视第一个网络接口上所有流过的数据包</p>
<h3 id="实例2：监视指定网络接口的数据包"><a href="#实例2：监视指定网络接口的数据包" class="headerlink" title="实例2：监视指定网络接口的数据包"></a>实例2：监视指定网络接口的数据包</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump -i eth1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong><br>如果不指定网卡，默认tcpdump只会监视第一个网络接口，一般是eth0。</p>
<h3 id="实例3：以IP与port-number抓下eth0这个网卡上-使得数据包"><a href="#实例3：以IP与port-number抓下eth0这个网卡上-使得数据包" class="headerlink" title="实例3：以IP与port number抓下eth0这个网卡上 使得数据包"></a>实例3：以IP与port number抓下eth0这个网卡上 使得数据包</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump -i eth0 -nn</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># tcpdump -nn -i eth0</span></div><div class="line">tcpdump: verbose output suppressed, use -v or -vv <span class="keyword">for</span> full protocol decode</div><div class="line">listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes</div><div class="line">13:00:35.277585 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 2573734647:2573734843, ack 2817100566, win 141, length 196</div><div class="line">13:00:35.277769 IP 192.168.0.100.49602 &gt; 192.168.0.73.22: Flags [.], ack 196, win 252, length 0</div><div class="line">13:00:35.292177 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 196:472, ack 1, win 141, length 276</div><div class="line">13:00:35.307810 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 472:636, ack 1, win 141, length 164</div><div class="line">13:00:35.308018 IP 192.168.0.100.49602 &gt; 192.168.0.73.22: Flags [.], ack 636, win 251, length 0</div><div class="line">13:00:35.338945 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 636:896, ack 1, win 141, length 260</div><div class="line">13:00:35.340898 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 896:1060, ack 1, win 141, length 164</div><div class="line">13:00:35.341088 IP 192.168.0.100.49602 &gt; 192.168.0.73.22: Flags [.], ack 1060, win 256, length 0</div><div class="line">13:00:35.356706 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 1060:1320, ack 1, win 141, length 260</div><div class="line">13:00:35.356935 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 1320:1484, ack 1, win 141, length 164</div><div class="line">13:00:35.357059 IP 192.168.0.100.49602 &gt; 192.168.0.73.22: Flags [.], ack 1484, win 254, length 0</div><div class="line">13:00:35.372128 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 1484:1744, ack 1, win 141, length 260</div><div class="line">13:00:35.382482 IP 192.168.0.100.49602 &gt; 192.168.0.73.22: Flags [P.], seq 1:53, ack 1744, win 253, length 52</div><div class="line">13:00:35.382649 IP 192.168.0.73.22 &gt; 192.168.0.100.49602: Flags [P.], seq 1744:2020, ack 53, win 141, length 276</div><div class="line">^C</div><div class="line">14 packets captured</div><div class="line">14 packets received by filter</div><div class="line">0 packets dropped by kernel</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;第三列和第四列显示的信息为哪一个IP+port 在连接哪一个IP+port，后面的信息是该数据包的相关信息。这里需要关注的只是第三列以及第四列。<code>-i</code>选项后面跟设备名称，如果想抓其他网卡的包，后面则要跟其他网卡名。至于<code>-nn</code>选项是作用是让第三列和第四列西安市城IP+端口号的形式，如果不加<code>-nn</code>则显示的是主机名+服务名称。</p>
<h3 id="实例4：截获所有210-27-48-1的主机收到的和发出的所有的数据"><a href="#实例4：截获所有210-27-48-1的主机收到的和发出的所有的数据" class="headerlink" title="实例4：截获所有210.27.48.1的主机收到的和发出的所有的数据"></a>实例4：截获所有210.27.48.1的主机收到的和发出的所有的数据</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump host 210.27.48.1</div></pre></td></tr></table></figure>
<h3 id="实例5：截获主机210-24-48-1和主机210-24-48-2或210-27-48-3的通信"><a href="#实例5：截获主机210-24-48-1和主机210-24-48-2或210-27-48-3的通信" class="headerlink" title="实例5：截获主机210.24.48.1和主机210.24.48.2或210.27.48.3的通信"></a>实例5：截获主机210.24.48.1和主机210.24.48.2或210.27.48.3的通信</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump host 210.2748.1 and 210.27.48.2 or 210.27.48.3</div></pre></td></tr></table></figure>
<h3 id="实例6：获取主机210-27-48-1除了和主机210-27-48-2之外所有主机通信的ip包"><a href="#实例6：获取主机210-27-48-1除了和主机210-27-48-2之外所有主机通信的ip包" class="headerlink" title="实例6：获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包"></a>实例6：获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump ip host 210.27.48.1 and ! 210.27.48.2</div></pre></td></tr></table></figure>
<h3 id="实例7：获取主机192-168-228-246接收或发出的ssh包，并且不转换主机名"><a href="#实例7：获取主机192-168-228-246接收或发出的ssh包，并且不转换主机名" class="headerlink" title="实例7：获取主机192.168.228.246接收或发出的ssh包，并且不转换主机名"></a>实例7：获取主机192.168.228.246接收或发出的ssh包，并且不转换主机名</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp</div></pre></td></tr></table></figure>
<h3 id="实例8：获取主机192-168-228-246接收或发出的ssh包，并把mac地址也一同显示"><a href="#实例8：获取主机192-168-228-246接收或发出的ssh包，并把mac地址也一同显示" class="headerlink" title="实例8：获取主机192.168.228.246接收或发出的ssh包，并把mac地址也一同显示"></a>实例8：获取主机192.168.228.246接收或发出的ssh包，并把mac地址也一同显示</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump  -e src host 192.168.228.246 and port 22 and tcp -n -nn</div></pre></td></tr></table></figure>
<h3 id="实例9：过滤的是源主机为192-168-0-1与目的网路哦为192-168-0-0的报头"><a href="#实例9：过滤的是源主机为192-168-0-1与目的网路哦为192-168-0-0的报头" class="headerlink" title="实例9：过滤的是源主机为192.168.0.1与目的网路哦为192.168.0.0的报头"></a>实例9：过滤的是源主机为192.168.0.1与目的网路哦为192.168.0.0的报头</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24</div></pre></td></tr></table></figure>
<h3 id="实例10：过滤源主机物理地址为XXX的报头"><a href="#实例10：过滤源主机物理地址为XXX的报头" class="headerlink" title="实例10：过滤源主机物理地址为XXX的报头"></a>实例10：过滤源主机物理地址为XXX的报头</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump ether src 00:50:04:BA:98 and dst……</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ether src后面没有host或者net，物理地址当然不可能有网络。</p>
<h3 id="实例11：过滤源主机192-168-0-1和目的端口不是telnet的报头，并导入到test-txt文件中"><a href="#实例11：过滤源主机192-168-0-1和目的端口不是telnet的报头，并导入到test-txt文件中" class="headerlink" title="实例11：过滤源主机192.168.0.1和目的端口不是telnet的报头，并导入到test.txt文件中"></a>实例11：过滤源主机192.168.0.1和目的端口不是telnet的报头，并导入到test.txt文件中</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump src host 192.168.0.1 and dst port not telnet -l &gt; test.txt</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ip、icmp、arp、rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置，用来过滤数据报的类型。</p>
<h3 id="实例12：捕获192-168-1-100主机eth1网卡上80端口接收和发出的数据100条，并保存文件1-cap"><a href="#实例12：捕获192-168-1-100主机eth1网卡上80端口接收和发出的数据100条，并保存文件1-cap" class="headerlink" title="实例12：捕获192.168.1.100主机eth1网卡上80端口接收和发出的数据100条，并保存文件1.cap"></a>实例12：捕获192.168.1.100主机eth1网卡上80端口接收和发出的数据100条，并保存文件1.cap</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tcpdump -nn -i eth1 host 192.168.1.100 and port 80 -c 100 -w 1.cap</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用host指定ip，port指定端口，-c指定包数量，-w写入指定文件里。而不加 -w直接在屏幕上显示的不是数据包，而是数据流向。这个1.cap可以下载到windows上，谈后用wireshark查看。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/78.Linux 命令- sar/">Linux 命令- sar</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sar（System ActivityReporter系统活动情况报告）是目前Linux上最为全面的系统性能分析工具之一，可以从多方面对系统的活动进行报告，包括：文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。它不同于其他系统状态监控工具的地方在于，它可以打印历史信息，可以显示当天从零点开始到当前时刻的系统状态信息。如果你系统没有安装这个命令，请使用 <code>yum install  -y sysstat</code> 命令安装。初次使用sar命令会报错，那是因为sar工具还没有生成相应的数据库文件（时时监控就不会了，因为不用去查询那个库文件）。它的数据库文件在 “/var/log/sa/” 目录下，默认保存一个月。</p>
<h2 id="命令格式"><a href="#命令格式" class="headerlink" title="命令格式"></a>命令格式</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar [选项] [时间间隔] [次数]</div></pre></td></tr></table></figure>
<h2 id="命令选项"><a href="#命令选项" class="headerlink" title="命令选项"></a>命令选项</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sar命令的选项很多，下面只列出常用选项：</p>
<ul>
<li><p>-A:所有报告的总和</p>
</li>
<li><p>-b:显示I/O和传递速率的统计信息</p>
</li>
<li><p>-B:显示换页状态</p>
</li>
<li><p>-d:输出每一块磁盘的使用信息</p>
</li>
<li><p>-e:设置显示报告的结束时间</p>
</li>
<li><p>-f:从制定的文件读取报告</p>
</li>
<li><p>-i:设置状态信息刷新的间隔时间</p>
</li>
<li><p>-P:报告每个CPU的状态</p>
</li>
<li><p>-R:显示内存状态</p>
</li>
<li><p>–u:输出cpu使用情况和统计信息</p>
</li>
<li><p>–v:显示索引节点、文件和其他内核表的状态</p>
</li>
<li><p>-w:显示交换分区的状态</p>
</li>
<li><p>-x:显示给定进程的装</p>
</li>
<li><p>-r:报告内存利用率的统计信息</p>
</li>
</ul>
<h2 id="使用实例"><a href="#使用实例" class="headerlink" title="使用实例"></a>使用实例</h2><h3 id="实例1：统计CPU的使用情况，每间隔1秒钟统计一次，总共统计三次"><a href="#实例1：统计CPU的使用情况，每间隔1秒钟统计一次，总共统计三次" class="headerlink" title="实例1：统计CPU的使用情况，每间隔1秒钟统计一次，总共统计三次"></a>实例1：统计CPU的使用情况，每间隔1秒钟统计一次，总共统计三次</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -u 1 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -u 1 3</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时27分59秒     CPU     %user     %nice   %system   %iowait    %steal     %idle</div><div class="line">13时28分00秒     all      0.00      0.00      0.50      0.00      0.00     99.50</div><div class="line">13时28分01秒     all      0.00      0.00      0.25      0.00      0.00     99.75</div><div class="line">13时28分02秒     all      0.25      0.00      1.00      0.50      0.00     98.26</div><div class="line">平均时间:     all      0.08      0.00      0.58      0.17      0.00     99.17</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong>      </p>
<ul>
<li><p>#%user #用户空间的CPU使用</p>
</li>
<li><p>#%nice 改变过优先级的进程的CPU使用率</p>
</li>
<li><p>#%system 内核空间的CPU使用率</p>
</li>
<li><p>#%iowait CPU等待IO的百分比 </p>
</li>
<li><p>#%steal 虚拟机的虚拟机CPU使用的CPU</p>
</li>
<li><p>#%idle 空闲的CPU</p>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在以上的显示当中，主要看%iowait和%idle，%iowait过高表示存在I/O瓶颈，即磁盘IO无法满足业务需求，如果%idle过低表示CPU使用率比较严重，需要结合内存使用等情况判断CPU是否瓶颈。</p>
<h3 id="实例2：每个CPU的使用状态"><a href="#实例2：每个CPU的使用状态" class="headerlink" title="实例2：每个CPU的使用状态"></a>实例2：每个CPU的使用状态</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -p 1 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -p 1 3 </span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时31分16秒     CPU     %user     %nice   %system   %iowait    %steal     %idle</div><div class="line">13时31分17秒     all      0.00      0.00      0.25      0.00      0.00     99.75</div><div class="line">13时31分18秒     all      0.25      0.00      0.50      0.00      0.00     99.26</div><div class="line">13时31分19秒     all      0.00      0.00      0.25      0.00      0.00     99.75</div><div class="line">平均时间:     all      0.08      0.00      0.33      0.00      0.00     99.58</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#CPU 所有CPU的统计</p>
</li>
<li><p>#%user 用户态的CPU使用统计</p>
</li>
<li><p>#%nice 更改过优先级的进程的CPU使用统计</p>
</li>
<li><p>#%iowait CPU等待IO数据的百分比</p>
</li>
<li><p>#%steal 虚拟机的vCPU占用的物理CPU的百分比</p>
</li>
<li><p>#%idle 空闲的CPU百分比</p>
</li>
</ul>
<h3 id="实例3：查看平均负载"><a href="#实例3：查看平均负载" class="headerlink" title="实例3：查看平均负载"></a>实例3：查看平均负载</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -q</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -q 2 2</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时35分07秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15</div><div class="line">13时35分09秒         0       167      0.00      0.00      0.00</div><div class="line">13时35分11秒         0       167      0.00      0.00      0.00</div><div class="line">平均时间:         0       167      0.00      0.00      0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#runq-sz  运行队列的长度（等待运行的进程数，每核的CP不能超过3个）</p>
</li>
<li><p>#plist-sz 进程列表中的进程（processes）和线程数（threads）的数量</p>
</li>
<li><p>#ldavg-1 最后1分钟的CPU平均负载，即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值，5分钟和15分钟以此类推</p>
</li>
<li><p>#ldavg-5 最后5分钟的CPU平均负载</p>
</li>
<li><p>#ldavg-15 最后15分钟的CPU平均负载</p>
</li>
</ul>
<h3 id="实例4：查看内存使用情况"><a href="#实例4：查看内存使用情况" class="headerlink" title="实例4：查看内存使用情况"></a>实例4：查看内存使用情况</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -r</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -r 1 2</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时38分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit</div><div class="line">13时38分02秒   1507864    398688     20.91     19632    176552    237716      3.90</div><div class="line">13时38分03秒   1507864    398688     20.91     19632    176552    237716      3.90</div><div class="line">平均时间:   1507864    398688     20.91     19632    176552    237716      3.90</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#kbmemfree  空闲的物理内存大小</p>
</li>
<li><p>#kbmemused  使用中的物理内存大小</p>
</li>
<li><p>#%memused 物理内存使用率</p>
</li>
<li><p>#kbbuffers 内核中作为缓冲区使用的物理内存大小，kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. </p>
</li>
<li><p>#kbcached 缓存的文件大小</p>
</li>
<li><p>#kbcommit  保证当前系统正常运行所需要的最小内存，即为了确保内存不溢出而需要的最少内存（物理内存+Swap分区）</p>
</li>
<li><p>#commit 这个值是kbcommit与内存总量（物理内存+swap分区）的一个百分比的值</p>
</li>
</ul>
<h3 id="实例5：查看系统swap分区的统计信息"><a href="#实例5：查看系统swap分区的统计信息" class="headerlink" title="实例5：查看系统swap分区的统计信息"></a>实例5：查看系统swap分区的统计信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -W</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -W 1 2</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时40分51秒  pswpin/s pswpout/s</div><div class="line">13时40分52秒      0.00      0.00</div><div class="line">13时40分53秒      0.00      0.00</div><div class="line">平均时间:      0.00      0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#pswpin/s  每秒从交换分区到系统的交换页面（swap page）数量</p>
</li>
<li><p>#pswpott/s 每秒从系统交换到swap的交换页面（swap page）的数量</p>
</li>
</ul>
<h3 id="实例6：查看I-O和传递速率的统计信息"><a href="#实例6：查看I-O和传递速率的统计信息" class="headerlink" title="实例6：查看I/O和传递速率的统计信息"></a>实例6：查看I/O和传递速率的统计信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -b</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -b 1 3</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时43分10秒       tps      rtps      wtps   bread/s   bwrtn/s</div><div class="line">13时43分11秒      0.00      0.00      0.00      0.00      0.00</div><div class="line">13时43分12秒      0.00      0.00      0.00      0.00      0.00</div><div class="line">13时43分13秒      0.00      0.00      0.00      0.00      0.00</div><div class="line">平均时间:      0.00      0.00      0.00      0.00      0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#tps  磁盘每秒钟的IO总数，等于iostat中的tps</p>
</li>
<li><p>#rtps 每秒钟从磁盘读取的IO总数</p>
</li>
<li><p>#wtps 每秒钟从写入到磁盘的IO总数</p>
</li>
<li><p>#bread/s 每秒钟从磁盘读取的块总数</p>
</li>
<li><p>#bwrtn/s 每秒钟此写入到磁盘的块总数</p>
</li>
</ul>
<h3 id="实例7：磁盘使用详情统计"><a href="#实例7：磁盘使用详情统计" class="headerlink" title="实例7：磁盘使用详情统计"></a>实例7：磁盘使用详情统计</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -d</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -d 1 3</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时45分57秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util</div><div class="line">13时45分58秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">13时45分58秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line"></div><div class="line">13时45分58秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util</div><div class="line">13时45分59秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">13时45分59秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line"></div><div class="line">13时45分59秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util</div><div class="line">13时46分00秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">13时46分00秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line"></div><div class="line">平均时间:       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util</div><div class="line">平均时间:   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">平均时间:    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#DEV 磁盘设备的名称，如果不加-p，会显示dev253-0类似的设备名称，因此加上-p显示的名称更直接</p>
</li>
<li><p>#tps：每秒I/O的传输总数</p>
</li>
<li><p>#rd_sec/s 每秒读取的扇区的总数</p>
</li>
<li><p>#wr_sec/s 每秒写入的扇区的 总数</p>
</li>
<li><p>#avgrq-sz 平均每次次磁盘I/O操作的数据大小（扇区）</p>
</li>
<li><p>#avgqu-sz 磁盘请求队列的平均长度</p>
</li>
<li><p>#await 从请求磁盘操作到系统完成处理，每次请求的平均消耗时间，包括请求队列等待时间，单位是毫秒（1秒等于1000毫秒），等于寻道时间+队列时间+服务时间</p>
</li>
<li><p>#svctm I/O的服务处理时间，即不包括请求队列中的时间</p>
</li>
<li><p>#%util I/O请求占用的CPU百分比，值越高，说明I/O越慢</p>
</li>
</ul>
<h3 id="实例8：进程、inode、文件和锁表状态"><a href="#实例8：进程、inode、文件和锁表状态" class="headerlink" title="实例8：进程、inode、文件和锁表状态"></a>实例8：进程、inode、文件和锁表状态</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -v</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -v 1 3</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时49分02秒 dentunusd   file-nr  inode-nr    pty-nr</div><div class="line">13时49分03秒     16295       672     12498         2</div><div class="line">13时49分04秒     16295       672     12498         2</div><div class="line">13时49分05秒     16295       672     12498         2</div><div class="line">平均时间:     16295       672     12498         2</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#dentunusd 在缓冲目录条目中没有使用的条目数量</p>
</li>
<li><p>#file-nr 被系统使用的文件句柄数量</p>
</li>
<li><p>#inode-nr 已经使用的索引数量 </p>
</li>
<li><p>#pty-nr 使用的pty数量</p>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里面的索引和文件句柄值不是ulimit -a查看到的值，而是sysctl.conf里面定义的和内核相关的值， max-file表示系统级别的能够打开的文件句柄的数量， 而ulimit -n控制进程级别能够打开的文件句柄的数量，可以使用sysctl  -a | grep inode和sysctl  -a | grep file查看，具体含义如下：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制(系统级别， kernel-level)。 （The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate）。当收到”Too many open files in system”这样的错误消息时， 就应该曾加这个值了。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># cat /proc/sys/fs/file-max</span></div><div class="line">4096</div><div class="line"><span class="comment"># echo 100000 &gt; /proc/sys/fs/file-max</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;或者</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># echo ""fs.file-max=65535" &gt;&gt; /etc/sysctl.conf</span></div><div class="line"><span class="comment"># sysctl -p</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;file-nr 可以查看系统中当前打开的文件句柄的数量。 他里面包括3个数字： 第一个表示已经分配了的文件描述符数量， 第二个表示空闲的文件句柄数量， 第三个表示能够打开文件句柄的最大值（跟file-max一致）。  内核会动态的分配文件句柄， 但是不会再次释放他们（这个可能不适应最新的内核了， 在我的file-nr中看到第二列一直为0， 第一列有增有减）    </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;man bash， 找到说明ulimit的那一节：提供对shell及其启动的进程的可用资源（包括文件句柄， 进程数量， core文件大小等）的控制。 这是进程级别的， 也就是说系统中某个session及其启动的每个进程能打开多少个文件描述符， 能fork出多少个子进程等… 当达到上限时， 会报错”Too many open files”或者遇上Socket/File: Can’t open so many files等</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sysctl fs.file-nr</span></div><div class="line">fs.file-nr = 672        0       187015</div><div class="line">You have new mail <span class="keyword">in</span> /var/spool/mail/root</div><div class="line">[root@localhost ~]<span class="comment"># sysctl -a | grep fs.file-nr</span></div><div class="line">fs.file-nr = 672        0       187015</div></pre></td></tr></table></figure>
<h3 id="实例9：统计网络信息"><a href="#实例9：统计网络信息" class="headerlink" title="实例9：统计网络信息"></a>实例9：统计网络信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -n</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sar -n选项使用6个不同的开关：DEV，EDEV，NFS，NFSD，SOCK，IP，EIP，ICMP，EICMP，TCP，ETCP，UDP，SOCK6，IP6，EIP6，ICMP6，EICMP6和UDP6 ，DEV显示网络接口信息，EDEV显示关于网络错误的统计数据，NFS统计活动的NFS客户端的信息，NFSD统计NFS服务器的信息，SOCK显示套接字信息，ALL显示所有5个开关。它们可以单独或者一起使用。 </p>
<h4 id="每间隔1秒统计一次，总计统计1次"><a href="#每间隔1秒统计一次，总计统计1次" class="headerlink" title="每间隔1秒统计一次，总计统计1次"></a>每间隔1秒统计一次，总计统计1次</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -n DEV 1 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -n DEV 1 1</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时56分20秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s</div><div class="line">13时56分21秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">13时56分21秒      eth0      1.01      1.01      0.06      0.17      0.00      0.00      0.00</div><div class="line"></div><div class="line">平均时间:     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s</div><div class="line">平均时间:        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">平均时间:      eth0      1.01      1.01      0.06      0.17      0.00      0.00      0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#IFACE 本地网卡接口的名称</p>
</li>
<li><p>#rxpck/s 每秒钟接受的数据包</p>
</li>
<li><p>#txpck/s 每秒钟发送的数据库</p>
</li>
<li><p>#rxKB/S 每秒钟接受的数据包大小，单位为KB</p>
</li>
<li><p>#txKB/S 每秒钟发送的数据包大小，单位为KB</p>
</li>
<li><p>#rxcmp/s 每秒钟接受的压缩数据包</p>
</li>
<li><p>#txcmp/s 每秒钟发送的压缩包</p>
</li>
<li><p>#rxmcst/s 每秒钟接收的多播数据包</p>
</li>
</ul>
<h4 id="统计网络设备通信失败信息"><a href="#统计网络设备通信失败信息" class="headerlink" title="统计网络设备通信失败信息"></a>统计网络设备通信失败信息</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -n EDEV 1 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -n EDEV 1 1</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">13时59分23秒     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s</div><div class="line">13时59分24秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">13时59分24秒      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line"></div><div class="line">平均时间:     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s</div><div class="line">平均时间:        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div><div class="line">平均时间:      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#IFACE 网卡名称</p>
</li>
<li><p>#rxerr/s 每秒钟接收到的损坏的数据包</p>
</li>
<li><p>#txerr/s 每秒钟发送的数据包错误数</p>
</li>
<li><p>#coll/s 当发送数据包时候，每秒钟发生的冲撞（collisions）数，这个是在半双工模式下才有</p>
</li>
<li><p>#rxdrop/s 当由于缓冲区满的时候，网卡设备接收端每秒钟丢掉的网络包的数目</p>
</li>
<li><p>#txdrop/s 当由于缓冲区满的时候，网络设备发送端每秒钟丢掉的网络包的数目</p>
</li>
<li><p>#txcarr/s  当发送数据包的时候，每秒钟载波错误发生的次数</p>
</li>
<li><p>#rxfram   在接收数据包的时候，每秒钟发生的帧对其错误的次数</p>
</li>
<li><p>#rxfifo    在接收数据包的时候，每秒钟缓冲区溢出的错误发生的次数</p>
</li>
<li><p>#txfifo    在发生数据包 的时候，每秒钟缓冲区溢出的错误发生的次数</p>
</li>
</ul>
<h3 id="统计socket连接信息"><a href="#统计socket连接信息" class="headerlink" title="统计socket连接信息"></a>统计socket连接信息</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -n SOCK 1 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -n SOCK 1 1</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">14时02分35秒    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw</div><div class="line">14时02分36秒       389         5         5         0         0         0</div><div class="line">平均时间:       389         5         5         0         0         0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#totsck 当前被使用的socket总数</p>
</li>
<li><p>#tcpsck 当前正在被使用的TCP的socket总数</p>
</li>
<li><p>#udpsck  当前正在被使用的UDP的socket总数</p>
</li>
<li><p>#rawsck 当前正在被使用于RAW的skcket总数</p>
</li>
<li><p>#if-frag  当前的IP分片的数目</p>
</li>
<li><p>#tcp-tw TCP套接字中处于TIME-WAIT状态的连接数量</p>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果使用FULL关键字，相当于上述DEV、EDEV和SOCK三者的综合</p>
<h4 id="TCP连接的统计"><a href="#TCP连接的统计" class="headerlink" title="TCP连接的统计"></a>TCP连接的统计</h4><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>命令</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sar -n TCP 1 3</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>输出</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># sar -n TCP 1 3</span></div><div class="line">Linux 2.6.32-431.el6.x86_64 (localhost)         2017年07月12日  _x86_64_        (4 CPU)</div><div class="line"></div><div class="line">14时05分30秒  active/s passive/s    iseg/s    oseg/s</div><div class="line">14时05分31秒      0.00      0.00      0.00      0.00</div><div class="line">14时05分32秒      0.00      0.00      1.04      1.04</div><div class="line">14时05分33秒      0.00      0.00      1.00      1.00</div><div class="line">平均时间:      0.00      0.00      0.68      0.68</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li><p>#active/s 新的主动连接</p>
</li>
<li><p>#passive/s 新的被动连接</p>
</li>
<li><p>#iseg/s 接受的段</p>
</li>
<li><p>#oseg/s 输出的段</p>
</li>
</ul>
<h4 id="sar-n-使用总结"><a href="#sar-n-使用总结" class="headerlink" title="sar -n 使用总结"></a>sar -n 使用总结</h4><ul>
<li>-n DEV ： 网络接口统计信息。</li>
<li>-n EDEV ： 网络接口错误。</li>
<li>-n IP ： IP数据报统计信息。</li>
<li>-n EIP ： IP错误统计信息。</li>
<li>-n TCP ： TCP统计信息。</li>
<li>-n ETCP ： TCP错误统计信息。</li>
<li>-n SOCK ： 套接字使用。</li>
</ul>
<h2 id="常用命令汇总"><a href="#常用命令汇总" class="headerlink" title="常用命令汇总"></a>常用命令汇总</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因版本和平台不同，有部分命令可能没有或显示结果不一致：</p>
<ol>
<li><code>sar -b 5 5</code>  IO传送速率</li>
<li><code>sar -B 5 5</code>  页交换速率</li>
<li><code>sar -c 5 5</code>  进程创建的速率</li>
<li><code>sar -d 5 5</code>  块设备的活跃信息</li>
<li><code>sar -n DEV 5 5</code>  网路设备的状态信息</li>
<li><code>sar -n SOCK 5 5</code>  SOCK的使用情况</li>
<li><code>sar -n ALL 5 5</code>  所有的网络状态信息</li>
<li><code>sar -P ALL 5 5</code>  每颗CPU的使用状态信息和IOWAIT统计状态 </li>
<li><code>sar -q 5 5</code>  队列的长度（等待运行的进程数）和负载的状态</li>
<li><code>sar -r 5 5</code>  内存和swap空间使用情况</li>
<li><code>sar -R 5 5</code>  内存的统计信息（内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页）</li>
<li>`sar -u 5 5  CPU的使用情况和IOWAIT信息（同默认监控）</li>
<li><code>sar -v 5 5</code>  inode, file and other kernel tablesd的状态信息</li>
<li><code>sar -w 5 5</code>  每秒上下文交换的数目</li>
<li><code>sar -W 5 5</code>  SWAP交换的统计信息(监控状态同iostat 的si so)</li>
<li><code>sar -x 2906 5 5</code>  显示指定进程(2906)的统计信息，信息包括：进程造成的错误、用户级和系统级用户CPU的占用情况、运行在哪颗CPU上</li>
<li><code>sar -y 5 5</code>  TTY设备的活动状态</li>
<li>将输出到文件(-o)和读取记录信息(-f)</li>
</ol>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/2. Linux 命令/76. Linux 命令- blkid/">Linux 命令- blkid</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux命令/">Linux命令</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在日常的运维工作中遇到过这样的情况，一台服务器上新装了两块磁盘，磁盘a（在服务器上显示为sdc）和磁盘b（在服务器上显示为sdd），有一次把这两块磁盘都拔掉了，然后再重新插上，重启机器，结果磁盘编号调换了，a变成了sdd，b变成了sdc（这是因为把磁盘插错了插槽），问题来了。通过上边的学习，你挂载磁盘是通过/dev/hdb1 这样的分区名字来挂载的，如果先前加入到了/etc/fstab 中，结果系统启动后则会挂载错分区。那么怎么样避免这样的情况发生？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这就用到了UUID，可以通过 blkid 命令获取各分区的UUID:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">/dev/sda1: UUID=<span class="string">"a593ff68-2db7-4371-8d8c-d936898e9ac9"</span> TYPE=<span class="string">"ext4"</span></div><div class="line">/dev/sda2: UUID=<span class="string">"ff042a91-b68f-4d64-9759-050c51dc9e8b"</span> TYPE=<span class="string">"swap"</span></div><div class="line">/dev/sda3: UUID=<span class="string">"95297b81-538d-4d96-870a-de90255b74f5"</span> TYPE=<span class="string">"ext4"</span></div><div class="line">/dev/sdb5: LABEL=<span class="string">"TEST"</span> UUID=<span class="string">"c61117ca-9176-4d0b-be4d-1b0f434359a7"</span> TYPE=<span class="string">"ext4"</span></div><div class="line">/dev/sdb6: UUID=<span class="string">"c271cb5a-cb46-42f4-9eb4-d2b1a5028e18"</span> SEC_TYPE=<span class="string">"ext2"</span> TYPE=<span class="string">"ext3"</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样可以获得全部磁盘分区的UUID，如果格式化的时候指定了 LABEL 则该命令也会显示LABEL值，甚至连文件系统类型也会显示。当然这个命令后面也可以指定哪个分区：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># blkid /dev/sdb5</span></div><div class="line">/dev/sdb5: LABEL=<span class="string">"TEST"</span> UUID=<span class="string">"c61117ca-9176-4d0b-be4d-1b0f434359a7"</span> TYPE=<span class="string">"ext4"</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;获得UUID后，如何使用它呢？</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># umount /newdir</span></div><div class="line">[root@localhost ~]<span class="comment"># mount UUID="c61117ca-9176-4d0b-be4d-1b0f434359a7" /newdir</span></div><div class="line">[root@localhost ~]<span class="comment"># df -h</span></div><div class="line">文件系统              容量  已用  可用 已用%% 挂载点</div><div class="line">/dev/sda3              14G  1.5G   12G  11% /</div><div class="line">tmpfs                 160M     0  160M   0% /dev/shm</div><div class="line">/dev/sda1              97M   27M   66M  29% /boot</div><div class="line">/dev/sdb5             989M   18M  921M   2% /newdir</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也可以把下面这行写到 /etc/fstab 中</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">UUID=c61117ca-9176-4d0b-be4d-1b0f434359a7              /newdir                 ext4    defaults        0 0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果想让某个分区开机后就自动挂载，有两个办法可以实现：</p>
<ol>
<li>在 /etc/fstab 中添加一行，如上例中那行；</li>
<li>把挂载命令写到 /etc/rc.d/rc.local 文件中去，阿铭会经常把想要开机启动的命令加到这个文件中。系统启动完后会执行这个文件中的命令，所以只要你想开机后运行什么命令统统写入到这个文件下面吧，直接放到最后面即可，阿铭把挂载的命令放到该文件的最后一行了：</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># cat /etc/rc.d/rc.local</span></div><div class="line"><span class="meta">#!/bin/sh</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># This script will be executed *after* all the other init scripts.</span></div><div class="line"><span class="comment"># You can put your own initialization stuff in here if you don't</span></div><div class="line"><span class="comment"># want to do the full Sys V style init stuff.</span></div><div class="line"></div><div class="line">touch /var/lock/subsys/<span class="built_in">local</span></div><div class="line">mount UUID=<span class="string">"c61117ca-9176-4d0b-be4d-1b0f434359a7"</span> /newdir</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以上两种方法，任选其一，介绍第二种方法其实也是一个小知识，如何让一些操作行为随系统启动而自动执行。另外一个小建议，那就是挂载磁盘分区的时候，尽量使用UUID或者LABEL这两种方法。</p>

	

	

</article>





	<span class="different-posts">📖 <a href="/page/49">more posts</a> 📖</span>



	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
